django 查询集使用 .values 作为外键字段

问题描述 投票:0回答:1

我有一个模型,其中

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'
创建者字段在用户填写时返回空值

我应该在这个字段中使用什么来显示用户价值?

django orm django-queryset
1个回答
0
投票

我应该在这个字段中使用什么来显示用户价值?

不要使用

.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')

注意:通常使用

settings.AUTH_USER_MODEL
[Django-doc] 来引用用户模型,而不是使用
User
模型[Django- doc]
直接。有关更多信息,您可以查看文档的引用
User
模型
部分

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.