我有一个模型,我需要在其中代表劳动申请的不同工作,例如:
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)
您立即可以看到我在重复
title
、 description
和 created_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/