我有以下型号:
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。我该怎么做?
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',)