Django ORM 特定查询
Django ORM specifc query
我有 2 个 django 模型:
class TelegramUser(models.Model):
telegram_id = models.IntegerField()
telegram_username = models.TextField(max_length=255, default=None, blank=True, null=True)
first_name = models.TextField(max_length=255, default=None, blank=True, null=True)
last_name = models.TextField(max_length=255, default=None, blank=True, null=True)
has_blocked = models.BooleanField(default=False)
class DutyDate(models.Model):
date = models.DateField(default=None, blank=True, null=True)
telegram_user = models.ForeignKey(TelegramUser, on_delete=models.SET_NULL, null=True)
group = models.ForeignKey(UserGroup, on_delete=models.CASCADE, null=True)
mark = models.FloatField(max_length=255, default=0)
is_open = models.BooleanField(default=True)
我需要获取分配的 DutyDates 少于 3 个的所有用户。我可以用一个查询来完成吗?如何做?
是。我们首先计算相关 DutyDate
的数量,然后根据该计数进行过滤:
from django.db.models import <b>Count</b>
TelegramUser.objects.annotate(
<b>nduty=Count('dutydate')</b>
).filter(
<b>nduty__lt=3</b>
)
这里是__lt
lookup [Django-doc] filters such that nduty
is (strictly) less than 3
. If you want to retain TelegramUser
s that have three related DutyDate
s as well, you can use the __lte
lookup [Django-doc].
我有 2 个 django 模型:
class TelegramUser(models.Model):
telegram_id = models.IntegerField()
telegram_username = models.TextField(max_length=255, default=None, blank=True, null=True)
first_name = models.TextField(max_length=255, default=None, blank=True, null=True)
last_name = models.TextField(max_length=255, default=None, blank=True, null=True)
has_blocked = models.BooleanField(default=False)
class DutyDate(models.Model):
date = models.DateField(default=None, blank=True, null=True)
telegram_user = models.ForeignKey(TelegramUser, on_delete=models.SET_NULL, null=True)
group = models.ForeignKey(UserGroup, on_delete=models.CASCADE, null=True)
mark = models.FloatField(max_length=255, default=0)
is_open = models.BooleanField(default=True)
我需要获取分配的 DutyDates 少于 3 个的所有用户。我可以用一个查询来完成吗?如何做?
是。我们首先计算相关 DutyDate
的数量,然后根据该计数进行过滤:
from django.db.models import <b>Count</b>
TelegramUser.objects.annotate(
<b>nduty=Count('dutydate')</b>
).filter(
<b>nduty__lt=3</b>
)
这里是__lt
lookup [Django-doc] filters such that nduty
is (strictly) less than 3
. If you want to retain TelegramUser
s that have three related DutyDate
s as well, you can use the __lte
lookup [Django-doc].