如何根据另一个模型的需求过滤Django模型?

如何根据另一个模型的需求过滤Django模型?,django,django-models,django-views,Django,Django Models,Django Views,我想从我的联系人模型中检索我的所有联系人,不包括我的DoNotContact模型中列出的联系人。以下是最有效的方法:contacts=Contact.objects.filter(dont_Contact=False)如果这需要很长时间才能处理,有没有更有效的方法 class Contact(models.Model): email = models.CharField(max_length=12) first_name = models.CharField(max_length

我想从我的
联系人
模型中检索我的所有联系人,不包括我的
DoNotContact
模型中列出的联系人。以下是最有效的方法:
contacts=Contact.objects.filter(dont_Contact=False)
如果这需要很长时间才能处理,有没有更有效的方法

class Contact(models.Model):
    email = models.CharField(max_length=12)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    audience = models.ForeignKey(Audience, on_delete=models.CASCADE)

    def dont_contact(self):
        try:
            get_object_or_404(DoNotContact, email=self.email)
            return True
        except:
            return False


    def __str__(self):
        return self.email

class DoNotContact(models.Model):
    email = models.CharField(max_length=12)


#views.py
def send_email(request):
    if request.method == "POST":
        contacts = Contact.objects.filter(dont_contact=False)

Kwargs使用的模型查询集过滤方法被解析为数据库列
dont\u contact
这里有一个方法,并且在
contact
模型中不作为列存在,因此调用
contact.objects.filter(dont\u contact=False)
将引发
字段错误

对于模型的当前实现,您可以执行以下操作

dont_contacts = DoNotContact.objects.values('email')
contacts = Contact.objects.exclude(email__in=dont_contacts)

具有更高性能的更好解决方案是删除
DoNotContact
,并在
Contact
中添加一个
BooleanField
来处理您的需求。

由于与我的应用程序相关的某些原因,我无法在
Contact
中设置与联系人相关的布尔字段。在您推荐的调整下,我当前实现的性能会有多低?在我看来,它不会转化为瓶颈。在本例中,如果我们使用
BooleanField
,将执行两个查询,而不是一个查询。我不明白您的意思。你的意思是如果我保留两种型号的
DoNotContact
Contact
就可以了,而且不会对性能产生太大影响吗?是的!如果保留这两种型号,将不会有相当大的性能变化。