Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使我的模型遵循干燥原则_Python_Django_Python 3.x_Django Models_Django Rest Framework - Fatal编程技术网

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)