Исключение результатов "многие ко многим" из Queryset в Django

У меня есть 3 модели, и я пытаюсь исключить определенные вещи в запросе, но мне трудно это сделать, потому что система many-to-many возвращает None и это нарушает exclude часть запроса.

Мои модели:

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

class RelatedCamps(models.Model):
    name = models.CharField(max_length=50, null=True, blank=True)
    camps = models.ManyToManyField(Camp, related_name="related_camps")

class CourseDetail(models.Model):
    camp = models.ForeignKey(Camp, on_delete=models.PROTECT)
    ...other attributes...

Я пытаюсь ограничить CourseDetail, которые я получаю обратно, следующим образом:

    # Get CourseDetails (this is well tested and works to return appropriate models)
    initial_course_details = get_available_course_details(student_id)
    # Get the camp_ids to check for 'related camps'
    course_detail_camp_ids = initial_course_details.values_list(
        "camp__id", flat=True
    )
    # Get the related_camp ids, so we can remove all of those from the total list
    related_camp_ids = initial_course_details.values_list(
        "camp__related_camps__camps", flat=True
    )
    # get the course_details, but remove the 'related_camp_ids'
    course_detail_camp_ids = course_detail_camp_ids.exclude(camp__in=related_camp_ids)

Это работает, если есть связанные_лагеря. Но в некоторых случаях это не работает, потому что 'related_camp_ids' возвращает список, подобный этому: [1, 2, None]

Когда возвращается список с None в нем - .exclude() не работает должным образом и список course_detail_camp_ids становится пустым.

Является ли выполнение чего-то подобного наиболее "django" способом?

    related_camp_ids = initial_course_details.values_list(
        "camp__related_camps__camps", flat=True
    ).exclude(camp__related_camps__camps=None)

Делать исключение таким образом похоже работает - но лучший ли это способ?

Вернуться на верх