Модель запросов с полем "многие ко многим" с пустым списком в качестве входных данных
У меня есть модель, содержащая поле многие-ко-многим:
class Transaction(models.Model):
id = models.UUIDField(default=uuid.uuid4, unique=True, editable=False, primary_key=True)
transaction_date = models.DateField(null=False, blank=False)
transaction_category = models.ForeignKey(Category, on_delete=models.PROTECT, null=False, blank=False)
customer_vendor = models.ForeignKey(CustomerVendor, on_delete=models.PROTECT, blank=False, null=False)
account = models.ForeignKey(Account, on_delete=models.PROTECT, blank=False, null=False)
reimbursable = models.BooleanField()
tag = models.ManyToManyField(Tag, blank=True)
amount = models.DecimalField(max_digits=12, decimal_places=2, null=False, blank=False)
description = models.CharField(max_length=255, null=False, blank=False)
У меня есть запрос, который дает мне транзакции:
Transaction.objects.filter(transaction_category__master_category__category_type="Income", transaction_date__range=[start_date, end_date]).filter(exclude_reimbursable).order_by().annotate(month=ExtractMonth("transaction_date"), year=ExtractYear("transaction_date")).values("month", "year").annotate(month_year=Concat("month", V(" "), "year", output_field=CharField()), month_total=Sum("amount")).values("month_year", "month_total").order_by("year", "month")
Я пытаюсь добавить тег (поле "многие ко многим") в запрос. Из веб-приложения я получаю все теги, которые выбрал пользователь, в виде списка. Список также может быть пустым и содержать 0 тегов.
Я пробовал использовать tag__in=tags
в запросе, но если пользователь не выбирает никаких тегов, это не работает. Если пользователь не выбрал ни одного тега, мы должны рассматривать это как то, что любая транзакция может быть возвращена, даже если в ней не выбрано ни одного тега.
Я также пробовал использовать Q(tag__in=tags) | Q(tag=None)
для получения транзакций с любым тегом ИЛИ без тега, что должно сделать то, что я хочу, но это всегда возвращает пустой набор запросов.
Для тех, кто ищет, я нашел ответ:
tag_query = Q(tag__isnull=True) | Q(tag__isnull=False)
Получает как тех, кто имеет метку, так и тех, кто не имеет метки, в отношениях "многие ко многим".