3

我有一個模型,其中我需要代表不同的工作崗位對勞動力的應用,例如:如何使我的模型遵循DRY原則

from django.db import models 

class PostFirstJobAd(models.Model): 
    fist_job_ad_title = models.CharField(max_length=225) 
    first_job_ad_description = models.TextField() 
    created_at = models.DateTimeField(auto_now=True) 

class PostSecondJobAd(models.Model): 
    second_job_ad_title = models.CharField(max_length=225) 
    second_job_ad_description = models.TextField() 
    created_at = models.DateTimeField(auto_now=True) 

class PostThirdJobAd(models.Model): 
    third_job_ad_title = models.CharField(max_length=225) 
    third_job_ad_description = models.TextField() 
    created_at = models.DateTimeField(auto_now=True) 

即刻就可以看到我重複titledescriptioncreated_at,我只是改變字段的名稱,它不是DRY和代碼開始氣味。原因是因爲我想在django admin裏面單獨註冊每個工作,所以我會在網站管理裏面有明確的情況。

的一種方法,使他們幹是用Abstract base classes但我有一個問題,因爲從文檔:

這種模式將不會再被用於創建任何數據庫表。 相反,當它用作其他模型的基類時,它的字段 將被添加到子類的那些字段中。

在這種情況下什麼是正確的方法,有人可以幫助我理解這一點。

回答

2

使用抽象的基本模型:

class JobAd(models.Model): 
    title = models.CharField(max_length=225) 
    description = models.TextField() 
    created_at = models.DateTimeField(auto_now=True) 

    class Meta: 
     abstract = True 

class PostFirstJobAd(JobAd): 
    pass 

class PostSecondJobAd(JobAd): 
    pass 

class PostThirdJobAd(JobAd): 
    pass 

這將創建3個表。基類JobAd在數據庫中沒有表。

由於您看起來有3個不同的模型,其代碼完全相同,您應該質疑您是否真的需要3種不同的模型。另一種選擇是將它們全部存儲在一張表中,併爲「其他」事物添加另一個字段。

class JobAd(models.Model): 
    pos = models.CharField(max_length=100, choices=['first', 'second', 'third']) 
    title = models.CharField(max_length=225) 
    description = models.TextField() 
    created_at = models.DateTimeField(auto_now=True) 

pos的整數字段也是可能的。

+0

我一直在質疑,我需要代表六個不同的工作,而我希望他們分開的原因是,因爲我想在管理員內部有明確的情況,我不希望我的申請人申請一個模型,所以對於每一份工作申請,我希望你能理解我 – PetarP

+0

重新思考你的設計。你真的不需要單獨的模型。 –

1

首先,抽象模型可能是你需要在這裏。根據業務需求,您可能需要在架構上考慮一些難題。

如果,事實上,你確實需要使用抽象基類:

class BaseJob(models.Model): 
    title = models.CharField(max_length=255) 
    # etc... 

    class Meta: 
     abstract = True 

    def method_1(self): 
     # base methods that work for instance data 

一旦被定義,你可以在一個具體的模型實現的基類。一個具體的模式是不使用abstract = True元類屬性的模型(或代理等)就像這樣:

class Job(BaseJob): 
    pass 

如果需要其他字段,你可以定義他們像任何其他模型場,但是當你運行makemigrations您會發現在生成的遷移中添加了字段。

相關問題