我有一个模型,其中
creator
字段是 user
表中的外键:
class CompanyTemplateMessage(models.Model):
name = models.CharField(max_length=100, blank=True, null=True)
subject = models.CharField(max_length=256)
company = models.ForeignKey('Company', on_delete=models.CASCADE, related_name='company_template')
text = models.TextField()
created_at = models.DateTimeField(auto_now=True, blank=True, null=True)
creator = models.ForeignKey(
'user.User',
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name='user_template_message',
)
用户:
class User(AbstractBaseUser, PermissionsMixin):
is_active = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
email = models.EmailField(max_length=255, unique=True)
phone = PhoneNumberField(unique=True, null=True, blank=True)
first_name = models.CharField(max_length=100, null=True, blank=True)
last_name = models.CharField(max_length=100, null=True, blank=True)
join_date = models.DateTimeField(auto_now_add=True)
companies = models.ManyToManyField(
'company.Company',
related_name='members',
blank=True,
)
USERNAME_FIELD = 'email'
def __str__(self):
return self.email
我想将此查询集与其他查询集组合并使用
union
,所以我必须使用 values()
选择这些查询集的相同字段才能联合
我使用这个查询集和
values()
参数来确定选择显示哪个字段
我在其中遇到问题的第一个查询集():
company_code = self.kwargs.get('company_code')
company_template_objs = CompanyTemplateMessage.objects.filter(company__code=company_code).values(
'name', 'created_at', 'creator')
第二个查询集并将其与第一个查询集结合:
def get_queryset(self):
company_code = self.kwargs.get('company_code')
company_template_objs = CompanyTemplateMessage.objects.filter(company__code=company_code).values('name', 'type', 'subject', 'text', 'creator')
default_template_objs = DefaultTemplateMessage.objects.all().values(
'name', 'type', 'subject', 'text').annotate(
creator=Value(4, output_field=IntegerField()))
template_objs = company_template_objs.union(default_template_objs)
return template_objs
如果我单独考虑第一个查询集而没有第二个查询集和
union
,当我不在其中使用values()
时,它可以正常工作并显示creator
字段。但是当我在字段中选择creator
时,它显示了这个错误:
'int' object has no attribute 'pk'
当我使用其他类似的东西时:
'creator__email'
或'creator__id'
创建者字段在用户填写时返回空值
我应该在这个字段中使用什么来显示用户价值?
我应该在这个字段中使用什么来显示用户价值?
不要使用
.values()
。事实上,Django 可以完美地遵循 ForeignKey
s,通过使用 .values()
它将返回一个 QuerySet
的字典,这些字典是对实例建模的“不那么丰富”的对象。您可以使用 .select_related(…)
[Django-doc] 在同一查询中有效地获取 creator
数据,尽管从 functional 的角度来看这不是必需的:
def get_queryset(self):
return CompanyTemplateMessage.objects.filter(
company__code=self.kwargs['company_code']
).select_related('creator')
[Django-doc] 来引用用户模型,而不是使用settings.AUTH_USER_MODEL
模型[Django- doc] 直接。有关更多信息,您可以查看文档的引用User
模型部分。User