我有一个模型,creator
字段是user
表的外键:
CompanyTemplateMessage
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',
)
DefaultTemplateMessage:(我想把这个表和前一个表结合起来,并在queryset中返回它们)
class DefaultTemplateMessage(models.Model):
name = models.CharField(max_length=100, blank=True, null=True)
subject = models.CharField(max_length=256)
text = models.TextField()
html = models.TextField()
用户:
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
数据,尽管从函数的角度来看,这是不必要的:
def get_queryset(self):
return CompanyTemplateMessage.objects.filter(
company__code=self.kwargs['company_code']
).select_related('creator')
注意:通常最好使用
settings.AUTH_USER_MODEL
[Django-doc]引用用户模型,而不是使用User
model[Django-doc]要了解更多信息,您可以查看文档中引用User
模型部分的。