Модель Джанго запрос обратная ссылка фильтр путаница - PullRequest
0 голосов
/ 14 марта 2012

Учитывая следующие модели

class Category(models.Model):
  name = models.CharField(max_length=50)

class Business(models.Model):
  name = models.CharField(max_length=50)
  category = models.ForeignKey(Category, related_name="businesses")

class Package(models.Model):
  business_id = models.ForeignKey(Business)
  status = models.CharField(max_length=50)

У меня есть 2 следующих запроса, чтобы получить список предприятий и категорий, в которых действуют пакеты:

filter_businesses = Business.objects.filter(package__status = 'live')
filter_categories = Category.objects.filter(businesses__package__status = 'live')

Теперь вопросы задаются, учитывая связанныеимя "business" должно быть равно category.business_set, почему фильтр в первом запросе не должен быть package_set?

1 Ответ

1 голос
/ 14 марта 2012

Предположим, у вас есть две связанные модели: SomeModel и SomeOtherModel, а SomeOtherModel.somemodel - это ForeignKey для SomeModel.

Для любого экземпляра SomeModel свойство someothermodel_set является менеджером для уже отфильтрованной связанной модели.Например:

>>> your_some_model_instance = SomeModel.objects.all()[0]

В этом случае your_some_model_instance.shomeothermodel_set эквивалентно:

>>> SomeOtherModel.objects.filter(somemodel=your_some_model_instance)

[обновление]

извините, возможно, я не объяснилмои вопросы более понятны, это сложно объяснить ... Я понимаю, что XX_set и related_name относятся к менеджеру, то, что я хочу спросить, в первом запросе, почему бы не использовать (package_set_ status = 'live'), учитывая второйрабочий запрос (business _package__status = 'live'), он сбивает с толку, потому что второй запрос ссылается на менеджера (по related_name), но первый запрос не ...

Интерфейс фильтраиспользует соглашение relatedmodelname__relatedmodelfield;В вашем примере related_name использовалось для придания более оригинального имени обратной ссылке, но это не является его главной целью;Назначение параметра related_name в полях ForeignKey - решение неоднозначности в случаях, когда relatedmodelname конфликтует с уже существующим полем в ForeignKey.

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