我有两张桌子' Contact'和其他人一样," Subscriber" ..我想比较两者的Contact_id,并且只想显示Contact中存在的那些Contact_id,而不是订阅者。这两个表有两种不同的模型。
答案 0 :(得分:1)
这样的事情应该有效:
Contact.objects.exclude(
id__in=Subscriber.objects.all()
).values_list('id', flat=True)
请注意,这些实际上是两个SQL查询。我确信有一些方法可以优化它,但这通常可以正常工作。
此外,values_list
与选择对象无关,它只是修改返回内容的“格式”(ID列表而不是对象的查询集 - 但在两种情况下都是相同的数据库记录)。 / p>
如果您被Subscriber.id
以外的某个字段排除(例如:Subscriber.quasy_id
):
Contact.objects.exclude(
id__in=Subscriber.objects.all().values_list('quasy_id', flat=True)
).values_list('id', flat=True)
修改强>
此答案假设您的Contact
和Subscriber
型号之间没有关系。如果你这样做,那么请参阅@ navit的答案,这是一个更好的选择。
编辑2:
实际上不需要flat=True
内的exclude
。
答案 1 :(得分:1)
我假设你有这样的模型:
class Subscriber(models.Model):
contact = models.ForeignKey(Contact)
你可以这样做你想做的事:
my_list = Subscriber.objects.filter(contact=None)
这将检索没有联系人的订阅者。检索联系人列表非常简单。
答案 2 :(得分:0)
如果您想比较两个不同表(与外键有联系)中字段的值,您可以使用以下方法:
我假设模型如下:
class Contact(models.Model):
name = models.TextField()
family = models.TextField()
class Subscriber(models.Model):
subscriber_name = models.ForeignKey(Contact, on_delete=models.CASCADE)
subscriber_family = models.TextField()
这将是查询:
query = Subscriber.objects.filter(subscriber_name =F(Contact__name))
return query