【问题标题】:Returning filtered objects(list or queryset)返回过滤的对象(列表或查询集)
【发布时间】:2017-08-05 21:09:59
【问题描述】:

我需要在 django rest 框架过滤器中过滤一些数据。我有模型:

class A(models.Model):
    ...
    connections = models.ManyToManyField(classB)
    ....


class B(models.Model):
   ...
   date_added=models.DateTimeField()
   ....

我需要返回带有过滤连接的 classA 对象。

例如,classA 对象与不同的 date_added 字段有许多联系。我需要返回带有连接的 classA 对象,但连接应该只从指定的日期开始。

classA 对象可以包含不同的连接,但如果它有一个指定日期的连接,我需要从 classA 返回对象,包含满足条件的连接,排除不满足该条件的连接。

有什么办法吗?

【问题讨论】:

    标签: django filtering django-queryset django-rest-framework


    【解决方案1】:

    你可以试试这个:

    A.objects.filter(connections__date_added=your_datetime)
    

    【讨论】:

    • 该查询集将返回至少有一个满足指定条件的连接的所有classA 对象。那么classA 对象也可以有不满足条件的connections。我必须返回所有classA 对象,这些对象至少有一个connection 满足指定条件,但没有connections 不满足条件。
    【解决方案2】:

    首先获取给定日期的所有 B 类对象的查询集。 然后对与该日期相关的所有连接进行反向查找。然后检查该多对多集合是否有任何其他连接!= 到原始给定日期,如果没有,则将 A 类对象添加到列表中:

    # queryset of all B objects for a specific date
    b_queryset = B.objects.filter(date_added__date=my_datetime_date)
    
    # Empty list to place all related A objects
    a_list_initial = []
    
    for x in b_queryset:
        # Add all related class A objects to a list
        [a_list_initial.append(y) for y in x.connections_set.all()]
    
    # Empty list to finally place only desired A objects
    desired_a_objects = []    
    for z in a_list_initial:
        checker = all(item.date_added__date == my_datetime_date for item in z.connections.all())
        if checker == True:
            desired_a_objects.append(z)
    

    它并不漂亮,但它会实现你想要的:) 对所有的编辑感到抱歉,这个有点让人费解。

    【讨论】:

      猜你喜欢
      • 2017-12-05
      • 2018-12-01
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      相关资源
      最近更新 更多