假设我有这些模型(非实用代码,它只是一个例子):
class BaseArticle(models.Model):
title = models.CharField(max_length=512)
author = models.ForeignKey(User)
content = models.TextField()
class Meta:
abstract = True
class ArticleWithColor(BaseArticle):
color = models.CharField(max_length=512)
class ArticleTypeWithSmell(BaseArticle):
smell = models.CharField(max_length=512)
在保存文章(颜色或气味文章)时,我想检查是否有任何其他现有实例具有相同的共享字段值(那些是BaseArticle字段)。
换句话说:我如何检查是否已经存在一个ArticleWithColor,它具有与BaseArticle继承的字段相同的值作为我即将保存的ArticleWithSmell?
答案 0 :(得分:0)
如果您只想保护自己免受重复数据的影响,可以使用unique_together选项。否则,使用model_to_dict(来自django.forms.models import model_to_dict)获取模型属性并进行比较。我不确定它是否将pk / id作为dict的一部分返回,但如果是这样,你应该在比较之前删除它。
答案 1 :(得分:0)
我已经更新了我的答案,以查询所有的儿童模特。这只是构建模型列表的一种方法。这取决于你的用例。
您可以沿着这些方向做某些事情(仍未经过测试):
class BaseArticle(models.Model):
title = models.CharField(max_length=512)
author = models.ForeignKey(User)
content = models.TextField()
_childrens = set()
# register the model on init
def __init__(self, *args, **kwargs):
super(BaseArticle, self).__init__(*args, **kwargs)
BaseArticle._childrens.add(self.__class__)
def save(self, *args, **kwargs):
for model in BaseArticle._childrens:
query = model.objects.filter(title=self.title, author=self.author, content=self.content)
# if this Article is already saved, exclude it from the search
if self.pk and model is self.__class__:
query.exclude(pk=self.pk)
if query.count():
# there's one or more articles with the same values
do_something()
break
super(BaseArticle, self).save(*args, **kwargs)
class Meta:
abstract = True