de-vraag
  • 質問
  • タグ
  • ユーザー
通知:
報酬:
登録
登録すると、質問に対する返答やコメントが通知されます。
ログイン
すでにアカウントをお持ちの方は、ログインして新しい通知を確認してください。
追加された質問、回答、コメントには報酬があります。
さらに
ソース
編集
 LaundroMat
LaundroMat
質問

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

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

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 2011-10-27T13:24:09+00:00 2
プログラミング
django
django-models
Ilian Iliev
27日 10月 2011 в 1:36
2011-10-27T13:36:50+00:00
さらに
ソース
編集
#56789247

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

0
0
Etienne
27日 10月 2011 в 1:37
2011-10-27T13:37:54+00:00
さらに
ソース
編集
#56789248

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

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

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
0
質問の追加
カテゴリ
すべて
技術情報
文化・レクリエーション
生活・芸術
科学
プロフェッショナル
事業内容
ユーザー
すべて
新しい
人気
1
Roxana Elizabeth CASTILLO Avalos
登録済み 16時間前
2
Hideo Nakagawa
登録済み 1日前
3
Sergiy Tytarenko
登録済み 3日前
4
shoxrux azadov
登録済み 5日前
5
Koreets Koreytsev
登録済み 1週間前
© de-vraag :年
ソース
stackoverflow.com
ライセンス cc by-sa 3.0 帰属