Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何在Queryset中将值ID更改为模型属性_Django_Python 3.x - Fatal编程技术网

Django 如何在Queryset中将值ID更改为模型属性

Django 如何在Queryset中将值ID更改为模型属性,django,python-3.x,Django,Python 3.x,Django QuerySet返回关联对象的PK,但我需要属性名。例如siting.objects.filter(complete=True)。值('user')将返回一个查询集,如:。如何轻松地将2转换为user.get\u full\u name()等 让我了解一下我在尝试什么: tests_taken = Sitting.objects.filter(complete=True).values('user') for test in tests_taken: try: t

Django QuerySet返回关联对象的PK,但我需要属性名。例如
siting.objects.filter(complete=True)。值('user')
将返回一个查询集,如:
。如何轻松地将
2
转换为
user.get\u full\u 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)
这看起来真的很低效,我也不确定接下来该怎么办

这:

给出此错误:

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
我的目标

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'}

您不能在值中使用方法,但可以这样做

queryset = Sitting.objects.filter(complete=True)
tests_taken = [{'full_name':user.get_full_name()} for user in queryset]

以下是代码的优化版本:

qs = Sitting.objects.filter(complete=True).values('user_id')
employees = Employee.objects.filter(id__in=qs)
编辑: 您实际上不需要
map
语句,在迭代查询集时调用
get\u full\u 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 %}
我假设您实际上不希望您的数据看起来像:

[{'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]

请显示您正在引用的模型,我不确定
是什么。get\u full\u name()
是什么。通过子查询实现这一点看起来很简单。
siting
是使用属性
user
引用的模型
Employee
是my
AbstractBaseUser
模型,因此我想调用
get\u full\u name()
,这是一种内置的Django方法,用于检索用户全名,然后将字典中的Id切换为员工的全名。然后我将把这些数据传递给JS图表。我已经更新了我的答案,尝试使用你的方法,尽管我可能在开始时没有提供足够的信息,这导致了我的脚被击中。请将你的qs=siting.objects.filter(complete=True)。value('user')更改为qs=siting.objects.filter(complete=True)将其更新为包括models@DavidAlford运行我的查询时会发生什么?它看起来应该能工作。是的,它能工作-谢谢。你能解释一下吗?我不太清楚
map()
lambda
,但我会调查一下。如果您给出上下文,这可能会有所帮助。@DavidAlford我添加了一个更新。我真的不知道为什么我使用
map
;P@DavidAlford如果您仍然想了解地图的功能,请给出一些很好的解释。
[(user.id, user.full_name) for user in employees]