Django 如何在Queryset中将值ID更改为模型属性
Django QuerySet返回关联对象的PK,但我需要属性名。例如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
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
是myAbstractBaseUser
模型,因此我想调用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]