仅从筛选器行django中选择非空字段

wb1gzix0  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(409)

我有一个查询,它获取我想要的必需行,但问题是大多数字段/列都有空值,我只想从这些行中获取那些非空值的字段

queryset = User.objects.filter(email__exact=email)

这是我的模型

class User(models.Model):
    email = models.CharField(max_length=50, null=True, blank=True)
    password = models.CharField(db_index=True, max_length=40, null=True)
    source = models.CharField(default='unknown', max_length=150, null=True)
    domain = models.CharField(max_length=50, null=True, blank=True)
    before_at = models.CharField(max_length=255, null=True, blank=True)
    username = models.CharField(db_index=True, max_length=150, null=True, blank=True)
    hash = models.CharField(max_length=255, null=True, blank=True)
    ipaddress = models.CharField(max_length=50, null=True, blank=True)
    phonenumber = models.CharField(max_length=100, null=True, blank=True)

    def __str__(self):
        if self.email != None:
            return self.email
        elif self.username != None:
            return self.username
ar5n3qh5

ar5n3qh51#

或者,您可以使用:

for q in queryset:
    if q.email == None or q.username == None:
      queryset = queryset.exclude(email=q.email)

我希望这能解决你的问题。

monwx1rj

monwx1rj2#

您可以通过以下方式获得可为空字段的列表:

nullable_fields = [f.name for f in User._meta.get_fields() if f.null]

通过这些字段,我们可以制作一个过滤器:

nonnullq = Q(
    *[f('{field}__isnull', False) for field in nullable_fields],
    _connector=Q.AND
)

如果字段为空,我们可以使用此筛选器排除所有记录:

queryset = User.objects.filter(nonnullq, email=email)

也就是说,几乎所有字段都可以为空,这是相当奇怪的。通常只有一小部分是可以为空的,因为它常常使模型更复杂。

相关问题