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

时间:2020-03-29 17:07:01

标签: django django-models django-views

我想从我的Contact模型中检索所有联系人,但我的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)

1 个答案:

答案 0 :(得分:1)

Kwargs使用的模型查询集过滤器方法解析为数据库列。 dont_contact是一种方法,在Contact模型中不作为列存在,因此调用Contact.objects.filter(dont_contact=False)将引发FieldError

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

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

具有更高性能的更好解决方案是删除DoNotContact并向BooleanField添加Contact来满足您的要求。

相关问题