Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查询django中多个字段的列表返回的结果比预期的多_Python_Django - Fatal编程技术网

Python 查询django中多个字段的列表返回的结果比预期的多

Python 查询django中多个字段的列表返回的结果比预期的多,python,django,Python,Django,我根据这里提供的答案编写了以下过滤器: 我遇到的问题是,它似乎过滤不当,有时它会匹配子列表,我使用get获取不同的警报,但我注意到其中一些错误,因为它们返回多个匹配,罪魁祸首是 [2016-07-27 18:02:23,473: WARNING/Worker-4] [<Entity: DOGE>, <Entity: 8.8.8.8>] [2016-07-27 18:02:23,474: WARNING/Worker-4] [<Entity: potato>,

我根据这里提供的答案编写了以下过滤器:

我遇到的问题是,它似乎过滤不当,有时它会匹配子列表,我使用get获取不同的警报,但我注意到其中一些错误,因为它们返回多个匹配,罪魁祸首是

[2016-07-27 18:02:23,473: WARNING/Worker-4] [<Entity: DOGE>, <Entity: 8.8.8.8>]
[2016-07-27 18:02:23,474: WARNING/Worker-4] [<Entity: potato>, <Entity: DOGE>, <Entity: 8.8.8.8>]
[2016-07-27 18:02:23,475: WARNING/Worker-4] [<Entity: desktop_potato>, <Entity: DOGE>, <Entity: 8.8.8.8>]
其中,distinct\u alert\u查询指的是上面提到的非常长的查询。这样做的问题是,如果查询在不同的_警报上与一组大于相关_实体的实体匹配,它将中断:(

型号:

class Distinct_Alert(models.Model):
    #alert_type = models.ForeignKey(Alert_Type, on_delete=models.CASCADE) for the sake of this problem and the filter, this isn't really needed. 
    entities = models.ManyToManyField(to='Entity', through='Entity_To_Alert_Map')

class Entity(models.Model):
    label = models.CharField(max_length=700, blank=False)
    #entity_type = models.ForeignKey(Entity_Type_Label) not necessary for this problem
    related_entities = models.ManyToManyField('self')

class Entity_To_Alert_Map(models.Model):
    entity = models.ForeignKey(Entity, on_delete=models.CASCADE)
    distinct_alert = models.ForeignKey(Distinct_Alert, on_delete=models.CASCADE)
    entity_alert_relationship_label = models.ForeignKey(Entity_Alert_Relationship_Label, on_delete=models.CASCADE)

    class Meta:
        unique_together = ('entity', 'distinct_alert', 'entity_alert_relationship_label')
试试这个:

from django.db.models import IntegerField, Case, When, F

Distinct_Alert.objects.filter(
    alert_type=alert_type
).annotate(
    num_entities=Count('entities'),
    num_relevant_entities=Count(
        Case(When(entities__in=relevant_entities, then=1),
             default=None,
             output_field=IntegerField()),
    ),
).filter(
    num_entities=F('num_relevant_entities'),
    num_relevant_entities=len(relevant_entities),
)
您的查询:

Distinct_Alert.objects.filter(
    entities__in=relevant_entities,
    alert_type=alert_type
).annotate(
    num_entities=Count('entities')
).filter(
    num_entities=len(relevant_entities)
)

.

请显示模型。@VladimirDanilov编辑以包含模型。@VladimirDanilov每个distinct_alert都有一个entities字段,该字段有一组实体对象。您希望获得
distinct_alert
对象,该对象具有
实体
,与
相关_实体
相同,对吗?@VladimirDanilov正确。警告如下:t可能有那些不同的_警报包含相同的相关实体+一些其他实体,在这种情况下,我不想要这些不同的_警报。嘿,弗拉基米尔,这对我来说不太管用,它似乎根本没有过滤,事实上它会返回300多个不同的_警报,而不是我以前收到的3个。@dumby.Fat.Cat Ed伊特。谢谢!谢谢@Vladimir!乍一看,它似乎很有魅力。但我的天啊,这看起来很复杂。再一次,谢谢bunch@Stupid.Fat.Cat看一看
class Distinct_Alert(models.Model):
    #alert_type = models.ForeignKey(Alert_Type, on_delete=models.CASCADE) for the sake of this problem and the filter, this isn't really needed. 
    entities = models.ManyToManyField(to='Entity', through='Entity_To_Alert_Map')

class Entity(models.Model):
    label = models.CharField(max_length=700, blank=False)
    #entity_type = models.ForeignKey(Entity_Type_Label) not necessary for this problem
    related_entities = models.ManyToManyField('self')

class Entity_To_Alert_Map(models.Model):
    entity = models.ForeignKey(Entity, on_delete=models.CASCADE)
    distinct_alert = models.ForeignKey(Distinct_Alert, on_delete=models.CASCADE)
    entity_alert_relationship_label = models.ForeignKey(Entity_Alert_Relationship_Label, on_delete=models.CASCADE)

    class Meta:
        unique_together = ('entity', 'distinct_alert', 'entity_alert_relationship_label')
from django.db.models import IntegerField, Case, When, F

Distinct_Alert.objects.filter(
    alert_type=alert_type
).annotate(
    num_entities=Count('entities'),
    num_relevant_entities=Count(
        Case(When(entities__in=relevant_entities, then=1),
             default=None,
             output_field=IntegerField()),
    ),
).filter(
    num_entities=F('num_relevant_entities'),
    num_relevant_entities=len(relevant_entities),
)
Distinct_Alert.objects.filter(
    entities__in=relevant_entities,
    alert_type=alert_type
).annotate(
    num_entities=Count('entities')
).filter(
    num_entities=len(relevant_entities)
)