Як параўнаць асобнікі розных мадэляў з той жа абстрактнай мадэллю ў іх аснове?

Выкажам здагадку, у мяне ёсць гэтыя мадэлі (не-практычны код, гэта проста прыклад):

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

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 імпарту model_to_dict) прыняць ўласцівасць мадэлі і параўнаць іх. Я не ўпэўнены, вяртае Ці РК/ідэнтыфікатар ў рамках Dict, але калі гэта так, вы павінны выдаліць яго, перш чым параўноўваць.

0
дададзена
Мая галоўная праблема ў тым, што я хацеў бы быць у стане праверыць, ці з'яўляецца якое-небудзь ўласцівасць мадэлі з'яўляюцца вытворнымі ад абстрактнай мадэлі і ці з'яўляецца гэтыя ўласцівасці маюць тое ж значэнне ў іншых мадэлях, атрыманых з абстрактнай мадэлі.
дададзена аўтар LaundroMat, крыніца
<�Код> unique_together не будзе працаваць праз 2 табліцы.
дададзена аўтар Etienne, крыніца