Django - фильтрация по родственным связанным объектам - PullRequest
0 голосов
/ 10 ноября 2009

С учетом следующих моделей, адаптированных с http://www.djangoproject.com/documentation/models/generic_relations/

class TaggedItem(models.Model):
    """A tag on an item."""
    tag = models.SlugField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

class Vegetable(models.Model):
    name = models.CharField(max_length=150)
    is_yucky = models.BooleanField(default=True)
    edible = models.BooleanField(default=True)

class Mineral(models.Model):
    name = models.CharField(max_length=150)
    hardness = models.PositiveSmallIntegerField()
    edible = models.BooleanField(default=True)

Как бы я отфильтровал TaggedItems так, чтобы я получал только те, которые с content_objects съедобны?

в идеале, что-то вроде:

TaggedItem.objects.filter(content_object.edible=True)



Что если Vegetable и Mineral имеют is_edible методы?

1 Ответ

1 голос
/ 10 ноября 2009

Вы не можете сделать это с общими отношениями, потому что ничто не может гарантировать, что у целевой модели даже будет поле edible.

Альтернативой является изменение структуры для использования наследования модели (для нескольких таблиц). Vegetable и Mineral наследуются от модели Taggable, которая содержит поле edible (или что-то еще, что вам нужно отфильтровать). Тогда TaggedItem будет иметь стандартный ForeignKey до Taggable, так что вы будете использовать стандартный синтаксис фильтра с двойным подчеркиванием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...