2016-06-17 63 views
0

說我有一個manytomany字段,並說我有x個元素。使用django中的對象列表來查詢manytomany字段,返回具有相同ID的多行

class Distinct_Alert(models.Model): 
    alert_type = models.ForeignKey(Alert_Type, on_delete=models.CASCADE) 
    entities = models.ManyToManyField(to='Entity', through='Entity_To_Alert_Map') 
    objects = Utility_Manager() 

class Entity(models.Model): 
    label = models.CharField(max_length=255, blank=False) 
    entity_type = models.ForeignKey(Entity_Type_Label) 
    related_entities = models.ManyToManyField('self') 
    identical_entities = models.ManyToManyField('self') 
    objects = Entity_Manager() 

    class Meta: 
     unique_together = ('label', 'entity_type') 

我目前做的事情

Distinct_Alert.objects.filter(alert_type=alert_type, entities__in=[entity[0] for entity in entities]).all() 

,但由於種種原因,這個查詢返回2個使用相同的ID不同的警報,任何想法,爲什麼?如果我添加distinct()來解決問題,但我試圖使用get,因爲表在技術上應該只有一個條目與該查詢匹配。

我最初做這個:

Distinct_Alert.objects.get_or_none(alert_type=alert_type, entities__in=[entity1, entity2....]) 

但隨後反彈這樣一個錯誤,get_or_none定義,像這樣

class Utility_Manager(models.Manager): 
    def get_or_none(self, **kwargs): 
     try: 
      return self.get(**kwargs) 
     except self.model.DoesNotExist: 
      return None 

,但是這是行不通的,因爲我有2個元素是被返回的情況下,如果這些元素在同一個查詢中是不同的並且是匹配的,但是返回的行實際上是相同的行,那將是一種奇怪的情況。

回答

0

當查詢跨越多行時,應該預期有重複。

docs

默認情況下,QuerySet不會消除重複行。在實踐中, 這很少是一個問題,因爲簡單查詢如 Blog.objects.all()不會引入重複結果 行的可能性。但是,如果您的查詢跨越多個表格,則在對QuerySet進行評估時, 可能會得到重複的結果。這時候,你最好 使用distinct()

所以,像你這樣做,使用distinct是消除DUP的標準方式。

0

看一看到 高清prefetch_related(個體經營,*查找): 「」」 返回一個新的QuerySet實例,將預取指定 許多-to-one和多到很多相關的對象時,查詢集是 評價。

當prefetch_related()被調用一次以上,查找到 預取列表被追加到。如果prefetch_related(無)被調用時,該列表 被清除。 或 DEF select_related(自,*字段): 「」「」 退貨一個將選擇相關對象的新QuerySet實例。

如果指定了字段,則它們必須是ForeignKey字段,並且只有那些相關的對象才包含在選擇中。

我已經在views.py中的select查詢中使用了它們,並且使用manytomany和foreign key很有用。

相關問題