django queryset свойство модели Foreignkey - PullRequest
0 голосов
/ 17 мая 2018

Можно ли создать набор запросов django, используя комбинацию полей модели и @property из модели Foreignkey?

У меня есть следующие модели:

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 голосов
/ 17 мая 2018

Эта функция еще не реализована в Django.Фильтры / значения Django работают на уровне базы данных, генерируя SQL, а property не является столбцом БД.

Вы можете сделать это с выражениями 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 по свойству

...