如何比较不同模型的实例与基础相同的抽象模型?

时间:2011-10-27 13:24:09

标签: django django-models

假设我有这些模型(非实用代码,它只是一个例子):

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?

2 个答案:

答案 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