django queryset使用.values作为外键字段



我有一个模型,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可以完美地遵循ForeignKeys,通过使用.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]引用用户模型,而不是使用Usermodel[Django-doc]要了解更多信息,您可以查看文档中引用User模型部分的

相关内容

  • 没有找到相关文章

最新更新