Получение набора запросов с использованием поля внешнего ключа в «другой стороне» отношения внешнего ключа

#django #django-models

#django #django-модели

Вопрос:

Простите меня, если вопрос не имеет смысла, пытаюсь научить себя django. Я пытался найти, как это сделать, но я не уверен, что использую правильные слова в своем поиске.

У меня есть следующие модели.

 class Category(models.Model):
    code = models.CharField(max_length=10, unique=True)
    description = models.CharField(max_length=50)

class UserGroupHeader(models.Model):
    code = models.CharField(max_length=10, unique=True)
    description = models.CharField(max_length=50)

class UserGroupDetail(models.Model):
    usergroupheader = models.ForeignKey(UserGroupHeader, on_delete=models.CASCADE)
    category = models.ForeignKey(Category, on_delete=models.PROTECT)
  

Как мне получить набор запросов из модели категорий, используя UserGroupHeader? пока что у меня получилось что-то вроде этого UserGroupHeader.objects.get(pk=9).usergroupdetail_set.all() , теперь из результата этого, как мне получить модель категории?

Ответ №1:

Я не уверен, что я точно понял, что вы пытаетесь сделать, но в целом, во время запроса вы можете отслеживать отношения, используя двойные подчеркивания. Ниже приведена пара возможных запросов:

 my_group_header = UserGroupHeader.objects.get(...)
Category.objects.filter(usergroupdetail__usergroupheader=my_group_header) # Gets Category objects related to my_group_header through UserGroupDetail model

Category.objects.filter(usergroupdetail__usergroupheader__code='abc') # Gets Category objects related to UserGroupHeader object with code 'abc' through UserGroupDetail model

UserGroupHeader.objects.filter(usergroupdetail__category__code='abc') # Gets UserGroupHeader objects related to Category object with code 'abc' through UserGroupDetail model
  

Комментарии:

1. Спасибо, второе — это именно то, что я искал.

Ответ №2:

Ваш запрос UserGroupHeader.objects.get(pk=9).usergroupdetail_set.all() вернул бы QuerySet несколько UserGroupDetail объектов. Чтобы получить category каждого UserGroupDetail , вы можете:

 for user_group_detail in UserGroupHeader.objects.get(pk=9).usergroupdetail_set.all():
    category = user_group_detail.category
    print(category. description)
  

Или что-то подобное в соответствии с вашими потребностями