Как отфильтровать модель Django на основе требований другой модели? - PullRequest
0 голосов
/ 29 марта 2020

Я хочу получить все мои контакты из моей модели 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 Ответ

1 голос
/ 29 марта 2020

Используемые Кваргсом методы фильтра наборов запросов модели преобразуются в столбцы базы данных. 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, который отвечает вашим требованиям.

...