假设我有这个模型:
class Contact(BaseModel):
order = models.ForeignKey(Order, related_name='contacts', blank=True, null=True)
type = models.CharField(max_length=15, choices=TYPES, blank=True))
我想找到order
和type
不是唯一的所有订单。
例如,有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
字段Contact
在annonate()
模型中是唯一的。
我尝试使用Django的from .python_contextual_test_manager.main_runner import main as main_runner
但未能将这两个字段联系起来。
是否可以使用Django查询执行此操作?
如果没有,我将非常感谢您在SQL中如何做到这一点。
非常感谢。
答案 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))