我有一个模型,我需要在其中代表劳动申请的不同工作,例如:

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 但我有一个问题,因为来自文档:



在这种情况下,正确的方法是什么,有人可以帮助我理解这一点。

最佳答案

使用抽象基本模型:

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 的整数字段也是可能的。

关于python - 如何让我的模型遵循 DRY 原则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40430546/

10-14 13:21
查看更多