如何在Django或SQL中查询Non Unique Together值?

时间:2016-11-20 14:47:55

标签: python sql django postgresql

假设我有这个模型:

class Contact(BaseModel):
    order = models.ForeignKey(Order, related_name='contacts', blank=True, null=True)
    type = models.CharField(max_length=15, choices=TYPES, blank=True))

我想找到ordertype不是唯一的所有订单。

例如,有order A并且有相关联系人:

Contact(order=orderA, type='broker')
Contact(order=orderA, type='broker')
Contact(order=orderA, type='delivery')

我想找到这个orderA,因为此订单和type='broker'Contact模型中不是唯一的。

然后有orderB和这些相关的联系人:

Contact(order=orderB, type='broker')
Contact(order=orderB, type='delivery')

我不希望这个orderB,因为它和type字段Contactannonate()模型中是唯一的。

我尝试使用Django的from .python_contextual_test_manager.main_runner import main as main_runner但未能将这两个字段联系起来。

是否可以使用Django查询执行此操作?

如果没有,我将非常感谢您在SQL中如何做到这一点。

非常感谢。

3 个答案:

答案 0 :(得分:3)

您可以使用SQL查询,如:

select distinct order_id
from (
    select order_id, type
    from Contact
    group by order_id, type
    having count(*) > 1);

“order”列显示为“order_id”,因为这是Django命名列的方式。

答案 1 :(得分:1)

您可以编写几种方法来解决此问题。我可能已经为你编写了这些方法,但无论如何都是一个解释。 def equal_to接受自我和其他一些联系,如果该联系人是同一个订单则返回true,否则输入false。 def all_not_unique返回所有非唯一联系对象的列表,没有重复项。应该像not_unique = Contact.all_not_unique()一样调用。

def equal_to(self, other):
    assert(self.id != other.id)
    if self.order.id == other.order.id:
        if self.type == other.type:
            return True
    return false

@classmethod
def all_not_unique(cls):
    query_set = cls.objects.all()
    not_unique_query_set = []
    for contact_one in query_set:
        found = False
        for contact_two in query_set:
            if not found:
                if contact_one.id != contact_two.id:
                    if contact_one.equal_to(contact_two):
                        not_unique_query_set.append(contact_one)
                        found = True

答案 2 :(得分:1)

这应该可以解决问题

qs = (Contact.objects.values('order','type')
         .annotate(cnt=models.Count('pk'))
         .filter(cnt__gt=1))