Djangonauts, мне нужно коснуться вашего мозга.
В двух словах, у меня есть следующие три модели:
class Location(models.Model):
name = models.CharField(max_length=100)
class Profile(models.Model):
locations_of_interest = models.ManyToManyField(Location)
class Question(models.Model):
locations = models.ManyToManyField(Location)
Я хочу найти все профили, чьи местоположения интересов пересекаются сместа, указанные для определенного вопроса.Это просто:
question = Question.objects.first()
matching_profiles = Profile.objects.filter(
locations_of_interest__in=question.locations.all()
)
Но кроме того, я также хотел бы знать, в какой степени перекрываются местоположения.
В простом Python я мог бы сделать что-то вроде этого:
question_location_names = [l['name'] for l in question.locations.all()]
for profile in matching_profiles:
profile_location_names = [l['name'] for l in profile.locations_of_interest.all()]
intersection = set(question_location_names).intersection(profile_location_names)
intersection_count = len(list(intersection))
# then proceed with this number
Тем не менее, мне кажется целесообразным выполнять операцию непосредственно в базе данных, если это возможно.
TL; DR
Поэтому мой вопрос:
Есть ли способ аннотировать набор запросов профиля этим счетчиком пересечений и таким образом выполнять операции в базе данных?
Я пробовал несколько вещей, но я не думаю, что они полезны дляте, кто читает это и может знать ответ.