如何比较django中两个不同表的具体值?

时间:2016-07-11 11:56:43

标签: python django django-models

我有两张桌子' Contact'和其他人一样," Subscriber" ..我想比较两者的Contact_id,并且只想显示Contact中存在的那些Contact_id,而不是订阅者。这两个表有两种不同的模型。

3 个答案:

答案 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)

修改

此答案假设您的ContactSubscriber型号之间没有关系。如果你这样做,那么请参阅@ 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