django queryset foreignkey模型属性

时间:2018-05-17 01:05:02

标签: django django-models django-views

是否可以使用外键模型中的模型字段和@property的组合创建django查询集?

我有以下型号:

class Person(models.Model):
    firstname = models.CharField(max_length=255)
    prefname = models.CharField(max_length=255,null=True,blank=True)
    surname = models.CharField(max_length=255,null=True,blank=True)

    def __str__(self):
        return str(self.person_name) if self.person_name else ''

    @property
    def person_name(self):
        if not self.surname:
            if not self.prefname:
                return self.firstname
            return self.prefname
        if not self.prefname:
            return ''.join([self.firstname,' ', self.surname])
        return ''.join([self.prefname,' ', self.surname])

class Task(models.Model):
    person = models.ForeignKey(Person)
    status = models.CharField(max_length=255,choices=(('OPEN','Open'),('CLOSED','Closed'))

我正在尝试使用以下命令创建一个查询集:

qs = Task.objects.all().values_list('person__person_name','status')

我在'person__person_name'上收到错误因为person_name是@property,而不是来自foreignkey模型的实际模型字段,所以它不是可用字段。

有解决方法吗?任何帮助非常感谢!

1 个答案:

答案 0 :(得分:0)

此功能尚未在Django中实现。 Django过滤器/值在数据库级别运行,生成SQL,而property不是DB列。

如果您的属性是一个简单的属性,则可以使用F表达式执行此操作,如下例所示:

@property
def chairs_needed(self):
    return self.num_employees - self.num_chairs


companies = Company.objects\
    .annotate(chairs_needed=F('num_employees') - F('num_chairs'))\
    .filter(chairs_needed__lt=4)

参考:Django filter by property