Django-从相关表中获取附加字段

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

我有以下型号:

class User(AbstractBaseUser, PermissionsMixin):
    SUPERVISOR = 1
    REVIEWER = 2
    VERIFIER = 3
    READ_ONLY = 4
    USER_TYPE = [
        (SUPERVISOR, 'Supervisor'),
        (REVIEWER, 'Reviewer'),
        (VERIFIER, 'Verifier'),
        (READ_ONLY, 'Read Only'),
    ]
    email = models.EmailField(max_length=50, unique=True)
    name = models.CharField(max_length=100)
    phone = models.CharField(max_length=50, null=True)
    role = models.IntegerField(
        choices=USER_TYPE,
        default=READ_ONLY
    )
    is_active = models.BooleanField(default=True)


class Comment(models.Model):
    text = models.TextField()
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.PROTECT
    )

查看:

class CommentViewSet(BaseCertViewSet):
    queryset = Comment.objects.annotate(user_role=ExpressionWrapper(
    F('user__role'), output_field=IntegerField()))
    serializer_class = serializers.CommentSerializer

序列化器:

class CommentSerializer(serializers.ModelSerializer):
    user = serializers.SlugRelatedField(
        read_only=True,
        slug_field='name'
    )

    user_role = serializers.IntegerField()

    class Meta:
        model = Comment
        fields = ('id', 'text', 'user', 'user_role',)
        read_only_fields = ('id',)

我的问题:当我点击注释API端点时,我也希望它也从用户模型中返回用户role。我该怎么做?

django django-rest-framework django-serializer
1个回答
0
投票
我相信您可以使用QuerySet.annotation

编辑:F来自django.db.models,因此您也必须导入它。

queryset = Comment.objects.annotate(user_role=F("user__role"))中的CommentViewSet

编辑:为了使序列化程序能够识别您要添加到QuerySet的字段,还必须在序列化程序上定义字段,如下所示:

class CommentSerializer(serializers.ModelSerializer): user = serializers.SlugRelatedField( read_only=True, slug_field='name' ) # add line below to your code user_role = IntegerField() class Meta: model = Comment # you have to add it to the list of fields as well fields = ('id', 'text', 'user', 'user_role') read_only_fields = ('id',)

© www.soinside.com 2019 - 2024. All rights reserved.