如何使用 ORM Django 获取连续 None 或空字段的计数?
How to get the count of fields that are either None ot empty in a row using ORM Django?
我有模型,
class personal_profile(models.Model):
custom_user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
picture = models.ImageField(default='pro.png', upload_to='profile_image', blank=True)
designation = models.CharField(max_length=255, blank=True, null=True)
gender = models.CharField(max_length=255, blank=True, null=True)
date_of_birth = models.DateField(blank=True, null=True)
language = models.CharField(max_length=255, blank=True, null=True)
linkedin_url = models.CharField(max_length=255, blank=True, null=True)
def __str__(self):
return str(self.pk)
我想获取 None 或 "".
字段的计数
personal_profile.objects.get(custom_user=some_user_id)
通过上面的查询,我可以获得该特定用户的查询集。现在我想检查属于那个 custom_user 的所有字段。例如,picture, desgination. gender, date_of_birth, language, linkedin_url
谢谢
你有两个选择。您可以在 python 级别或数据库级别进行计数。
解决方案#1 Python 级别
使用 @property
装饰器计算空字段的数量。
class PersonalProfile(models.Model):
...
@property
def empty_fields_count(self):
fields = ["picture", "desgination", "gender", "date_of_birth", "language", "linkedin_url"]
empty_values = {"", None}
empty_values_count = 0
for field in fields:
field_value = getattr(self, field)
if field_value in empty_values:
empty_values_count += 1
return empty_values_count
然后像这样使用它
personal_profile = PersonalProfile.objects.get(custom_user=some_user_id)
# this will return the number of empty fields
personal_profile.empty_fields_count
解决方案 #2 数据库级别
使用annotate
求和空字段数
personal_profile_queryset = PersonalProfile.objects.annotate(
picture_empty=models.Case(
models.When(models.Q(picture__isnull=True) | models.Q(picture=""), then=1),
default=0,
),
desgination_empty=models.Case(
models.When(models.Q(desgination__isnull=True) | models.Q(desgination=""), then=1),
default=0,
),
gender_empty=models.Case(
models.When(models.Q(gender__isnull=True) | models.Q(gender=""), then=1),
default=0,
),
date_of_birth_empty=models.Case(
models.When(date_of_birth__isnull=True, then=1),
default=0,
),
language_empty=models.Case(
models.When(models.Q(language__isnull=True) | models.Q(language=""), then=1),
default=0,
),
linkedin_url_empty=models.Case(
models.When(models.Q(linkedin_url__isnull=True) | models.Q(linkedin_url=""), then=1),
default=0,
),
empty_fields_count=(
models.F("picture_empty") +
models.F("desgination_empty") +
models.F("gender_empty") +
models.F("date_of_birth_empty") +
models.F("language_empty") +
models.F("linkedin_url_empty")
)
)
然后使用查询集如下
personal_profile = personal_profile_queryset.get(custom_user=some_user_id)
# this will return the number of empty fields
personal_profile.empty_fields_count
备注
如果您想重新使用带有注释的 empty_fields_count
属性的查询集,您可能需要将 annotate
代码移动到自定义 QuerySet
or Manager
中。
我有模型,
class personal_profile(models.Model):
custom_user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
picture = models.ImageField(default='pro.png', upload_to='profile_image', blank=True)
designation = models.CharField(max_length=255, blank=True, null=True)
gender = models.CharField(max_length=255, blank=True, null=True)
date_of_birth = models.DateField(blank=True, null=True)
language = models.CharField(max_length=255, blank=True, null=True)
linkedin_url = models.CharField(max_length=255, blank=True, null=True)
def __str__(self):
return str(self.pk)
我想获取 None 或 "".
字段的计数personal_profile.objects.get(custom_user=some_user_id)
通过上面的查询,我可以获得该特定用户的查询集。现在我想检查属于那个 custom_user 的所有字段。例如,picture, desgination. gender, date_of_birth, language, linkedin_url
谢谢
你有两个选择。您可以在 python 级别或数据库级别进行计数。
解决方案#1 Python 级别
使用 @property
装饰器计算空字段的数量。
class PersonalProfile(models.Model):
...
@property
def empty_fields_count(self):
fields = ["picture", "desgination", "gender", "date_of_birth", "language", "linkedin_url"]
empty_values = {"", None}
empty_values_count = 0
for field in fields:
field_value = getattr(self, field)
if field_value in empty_values:
empty_values_count += 1
return empty_values_count
然后像这样使用它
personal_profile = PersonalProfile.objects.get(custom_user=some_user_id)
# this will return the number of empty fields
personal_profile.empty_fields_count
解决方案 #2 数据库级别
使用annotate
求和空字段数
personal_profile_queryset = PersonalProfile.objects.annotate(
picture_empty=models.Case(
models.When(models.Q(picture__isnull=True) | models.Q(picture=""), then=1),
default=0,
),
desgination_empty=models.Case(
models.When(models.Q(desgination__isnull=True) | models.Q(desgination=""), then=1),
default=0,
),
gender_empty=models.Case(
models.When(models.Q(gender__isnull=True) | models.Q(gender=""), then=1),
default=0,
),
date_of_birth_empty=models.Case(
models.When(date_of_birth__isnull=True, then=1),
default=0,
),
language_empty=models.Case(
models.When(models.Q(language__isnull=True) | models.Q(language=""), then=1),
default=0,
),
linkedin_url_empty=models.Case(
models.When(models.Q(linkedin_url__isnull=True) | models.Q(linkedin_url=""), then=1),
default=0,
),
empty_fields_count=(
models.F("picture_empty") +
models.F("desgination_empty") +
models.F("gender_empty") +
models.F("date_of_birth_empty") +
models.F("language_empty") +
models.F("linkedin_url_empty")
)
)
然后使用查询集如下
personal_profile = personal_profile_queryset.get(custom_user=some_user_id)
# this will return the number of empty fields
personal_profile.empty_fields_count
备注
如果您想重新使用带有注释的 empty_fields_count
属性的查询集,您可能需要将 annotate
代码移动到自定义 QuerySet
or Manager
中。