ベースと同じ抽象モデルを持つ異なるモデルのインスタンスを比較するには?

私がこれらのモデルを持っているとします(非実用的なコードですが、これは単なる例です):

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フィールド)に同じ値を持つ他の既存のインスタンスが存在するかどうかをチェックしたいと思います。

言い換えれば:どのように私は私が保存しようとしているArticleWithSmellとしてBaseArticleから継承したフィールドのための同じ値を持つArticleWithColorが既に存在するかどうかを確認することができますか?

0

2 答え

私はすべての子供モデルを照会するために私の答えを更新しました。これは、モデルリストを作成する唯一の方法です。あなたのユースケースによって異なります。

あなたはおそらくそれらの行に沿って何かをすることができます(まだテストされていません):

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
0
追加された
self.objects.filter は、 BaseArticle から継承した他のモデルではなく、同じモデルのインスタンスのみをフィルタリングします。
追加された 著者 Alasdair,
そうそう!あなたはまったく正しい。これについて考えてみましょう...
追加された 著者 Etienne,
私はそれを解決する答えを更新しました。
追加された 著者 Etienne,

データの複製を防ぐためには、unique_togetherオプションを使用することができます。それ以外の場合は、model_to_dict(django.forms.models import model_to_dictから)を使用してモデルのプロパティを取得し、比較します。私はそれがdictの一部としてpk/idを返すかどうか確かではありませんが、もしそうなら、それを比較する前に削除するべきです。

0
追加された
私の主な問題は、モデルのプロパティが抽象モデルから派生しているかどうか、抽象モデルから派生した他のモデルではこれらのプロパティが同じ値を持つかどうかをチェックできるようにすることです。
追加された 著者 LaundroMat,
unique_together は2つのテーブルでは機能しません。
追加された 著者 Etienne,