Найти модели, которые имеют только одну конкретную связанную модель - PullRequest
1 голос
/ 05 марта 2019

Рассмотрим следующие модели:

class Product(models.Model):
    name = models.CharField(max_length=...)

class Size(models.Model):
    name = models.CharField(max_length=...)
    products = models.ManyToManyField(Product, through=ProductXSize,
        related_name='sizes', related_query_name='size')

class ProductXSize(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE,
        related_name='productxsizes', related_query_name='productxsize')
    size = models.ForeignKey(Size, on_delete=models.CASCADE,
        related_name='productxsizes', related_query_name='productxsize')

То, чего я хотел бы достичь, это:

for p in Product.objects.filter(sizes=[Size.object.get(...)]):
    ...

То есть найти товары, которые имеют один и тот же размер.

1 Ответ

4 голосов
/ 05 марта 2019

Вам необходимо аннотировать набор запросов агрегированным значением:

https://docs.djangoproject.com/en/2.1/topics/db/aggregation/#filtering-on-annotations

Product.objects.annotate(size_cnt=Count('size'))\  # annotate
    .filter(size_cnt=1)\  # keep all that have only one size
    .filter(size=...).all()  # keep all with a certain size
...