如果查询集包含Django中的数据,如何基于相关对象过滤查询集

时间:2019-05-22 06:43:25

标签: python django django-2.0

如果仅与其父对象相关的子对象具有数据,我想过滤并仅获取与其相关对象数据相关的那些数据。例如: 我有以下型号:

class Collection(models.Model):
    date_of_collection=models.DateField()

class Product(models.Model):
    name=models.CharField(max_length=100)
    collection = models.ForeignKey(Collection)

class Price(models.Model):
    price = models.FloatField()
    products = models.ForeignKey(Products, on_delete=models.CASCADE)

我的模型相关数据如下:

Collection:
+----+--------------------+
| id | date_of_collection |
+----+--------------------+
|  1 | 2019-01-17         |
|  2 | 2019-01-30         |
|  3 | 2019-02-01         |
|  4 | 2019-02-02         |
+----+--------------------+

Products:

 +----+--------------------------------+
 | id | name           | collection    |
 +----+--------------------------------+
 |  1 | product 1      | 3             |
 |  2 | product 2      | 1             |
 |  3 | product 3      | 1             |
 |  4 | product 4      | 4             |
 +----+--------------------------------+

Price:

| id     | price            | product               |
+--------+------------------+-----------------------+
| 1      | 10.00            | 1                     |
| 2      | 20.00            | 1                     |
| 3      | 12.00            | 3                     |
+--------+------------------+-----------------------+

在这里,我只与13产品相关的价格,因此我只希望那些基于查询集的产品,而我只希望根据特定的date_of_collection进行过滤。

我尝试了以下查询集:

collection_month = Collection.objects.filter(date_of_collection__month=2)
product = Product.objects.filter(collection_id__in=collection_month).exclude(price_set__price=None)

是我做的还是下一步的工作。它有时会给出不好的结果。我该怎么做。

1 个答案:

答案 0 :(得分:1)

你很近。
您不应该将collection_id与实际的收藏品进行比较-您可以通过collection__in=collection_month
您可以使用price

直接排除不包含price__isnull=True的产品

此查询将使用子查询(WHERE):

collection_month = Collection.objects.filter(date_of_collection__month=2)
products = Product.objects.filter(collection__in=collection_month).exclude(price__isnull=True)

此查询将使用rumored to be fasterINNER JOIN

products = Product.objects.filter(collection__date_of_collection__month=2).exclude(price__isnull=True)