Как изменить идентификатор значения на атрибут модели в Queryset - PullRequest
1 голос
/ 11 января 2020

Django QuerySets возвращает PK связанных объектов, но мне нужно имя атрибута. Например, Sitting.objects.filter(complete=True).values('user') вернет QuerySet, например: <QuerySet[{'user':2}, {'user':3}]>. Как мне легко конвертировать 2 в user.get_full_name() или что-то подобное?

Чтобы дать представление о том, что я пытался:

tests_taken = Sitting.objects.filter(complete=True).values('user')
for test in tests_taken:
   try:
      tests_taken[test]['user'] = Employee.objects.get(pk=test['user'])
   except TypeError:
      pass
print(tests_taken)

Это просто кажется действительно неэффективным, и я не действительно уверен, что делать здесь.

Это:

qs = Sitting.objects.filter(complete=True).values('user')
tests_taken = [{'user': Employee.objects.filter(pk=user).get_full_name()} for user in qs]
print(tests_taken)

Дает эту ошибку:

int () аргумент должен быть строкой, байтами- как объект или число, а не 'dict'

Модели :

class Sitting(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        verbose_name=_("User"),
        on_delete=models.CASCADE)

class Employee(AbstractUser):
    first_name = models.CharField(max_length=64)
    last_name = models.CharField(max_length=64)

    def get_full_name(self):
        # returns self.first_name + self.last_name

Моя цель :

{'user':2} следует преобразовать в {'user':'John Doe'}

Ответы [ 2 ]

1 голос
/ 11 января 2020

Вот оптимизированная версия вашего кода:

qs = Sitting.objects.filter(complete=True).values('user_id')
employees = Employee.objects.filter(id__in=qs)

Редактировать:

вам не нужен этот оператор map, и было бы наиболее эффективно вызвать get_full_name, пока вы перебираете свой набор запросов. Например:

qs = Sitting.objects.filter(complete=True).values('user_id')
employees = Employee.objects.filter(id__in=qs)

for employee in employees:
    print(employee.get_full_name())

Или в шаблоне:

{% for employee in employees %}
    <h1> {{ employee.get_full_name }}
{% endfor %}

Редактировать 2:

Я не совсем понимаю, почему вы хотите преобразовать свой набор запросов в список объектов, но, увы, вот вам go:

employees = [
    {'user':user.get_full_name()} 
    for user in Employee.objects.filter(id__in=qs)
]

Я собираюсь предположить, что вы на самом деле не хотите, чтобы ваши данные выглядели так:

[{'user':'john doe'}, {'user':'jane doe'}]

Вот что я думаю, что вы хотите:

employees = Employee.objects.filter(id__in=qs)

[{'id':user.id, 'full_name':user.full_name} for user in employees]

Или как список кортежей:

[(user.id, user.full_name) for user in employees]
0 голосов
/ 11 января 2020

Вы не можете использовать методы в значениях, но вместо этого вы можете сделать это,

queryset = Sitting.objects.filter(complete=True)
tests_taken = [{'full_name':user.get_full_name()} for user in queryset]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...