Исключение результатов "многие ко многим" из 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)
Делать исключение таким образом похоже работает - но лучший ли это способ?