Python 如何使我的模型遵循干燥原则
我有一个模型,在该模型中,我需要为人工应用程序表示不同的工作,例如:Python 如何使我的模型遵循干燥原则,python,django,python-3.x,django-models,django-rest-framework,Python,Django,Python 3.x,Django Models,Django Rest Framework,我有一个模型,在该模型中,我需要为人工应用程序表示不同的工作,例如: 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
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)
马上你们就可以看到我在重复标题
,描述
和创建时
,我只是在更改字段的名称,它还没干,代码开始发臭。这样做的原因是因为我想在django admin
中分别注册每个作业,所以我在站点管理中有明确的情况
使它们干燥的一种方法是使用抽象基类
,但我有一个问题,因为从文档中:
该模型将不会用于创建任何数据库表。
相反,当它用作其他模型的基类时,它的字段
将被添加到子类的
在这种情况下,什么是正确的方法,有人能帮我理解吗。首先,抽象模型可能是您需要的。根据业务需求,您可能需要更仔细地考虑体系结构 事实上,如果确实需要使用抽象基类:
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
一旦定义了基类,就可以在具体模型中实现基类。具体模型是不使用元类属性(或代理等)的模型,如下所示:
如果您需要其他字段,您可以像其他任何模型字段一样定义它们,但当您运行
makemigrations
时,您会发现这些字段会添加到生成的迁移中。使用抽象基础模型:
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个不同的模型。另一种选择是将它们全部存储在一个表中,并为“其他”内容添加另一个字段
pos
的整数字段也是可能的 我想问的是,我需要代表六种不同的工作,我希望他们分开的原因是,因为我想在管理层内部有一个明确的情况,我不希望我的申请人申请一种模式,所以对于每个工作一个申请,我希望你理解meRethink你的设计。你真的不需要单独的模型。
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
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)