Получить связанные объекты через FK FK в django (будет работать _set?) - PullRequest
0 голосов
/ 06 марта 2020

Если бы у меня была структура модели, подобная этой:

class Camp(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=200, blank=True, null=True)
    reg_start = models.DateTimeField()
    reg_end = models.DateTimeField()

class Course(models.Model):
    camp = models.ForeignKey(Camp, on_delete=models.PROTECT)
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=500, blank=True, null=True)

class ClassDetail(models.Model):
    course = models.ForeignKey(Course, on_delete=models.PROTECT)
    seat_count = models.IntegerField()
    limit_registrations = models.BooleanField(default=False)

class Registration(models.Model):
    person = models.ForeignKey(User, on_delete=models.PROTECT)
    class_detail = models.ForeignKey(CourseDetail, on_delete=models.PROTECT)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

Если у меня был пользователь, у которого (потенциально) было несколько Registrations, есть ли быстрый и простой способ получить список идентификаторов из этих лагерей?

Это то, что у меня сейчас есть (что работает, но я пытаюсь понять, смогу ли я устранить понимание списка)

        registration_queryset = Registration.objects.filter(
            person__id=user_id
        )

        camps_to_exclude = [
            x.course_detail.course.camp.id for x in registration_queryset
        ]
        # camp_list is an already existing queryset of camps
        camp_list = camp_list.exclude(
            id__in=camps_to_exclude,
        )

1 Ответ

1 голос
/ 06 марта 2020

Вот один из вариантов. Пока они являются наборами запросов, django сведет их в один запрос. Вы всегда можете проверить запрос с помощью print(queryset.query).

camp_list.exclude(
    id__in=registration_queryset.values_list('course_detail__course__camp__id', flat=True),
)

. Или вы можете сделать:

camp_list.exclude(
    course_set__classdetail_set__registration_set__person_id=user_id
).distinct()

. Отличное будет необходимо, поскольку вы пересекаете пару обратных внешних ключей. .

...