Django Queryset如何使用反向外键添加字段

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

我有以下两种型号,

class Person(models.Model):
    name = models.CharField(unique=True, max_length=45)
    nationality = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True, blank=True, null=True)

class UserOption(DFModel):
    user = models.ForeignKey('User', on_delete=models.CASCADE)
    option = models.CharField(max_length=40)
    person = models.ForeignKey('Person', on_delete=models.PROTECT, null=True)
    status = models.BooleanField(default=False)

下面是视图集

class PersonViewSet(viewsets.ModelViewSet):
    queryset = apis_models.Person.objects.all()
    serializer_class = apis_serializers.PersonSerializer
    permission_classes = [HasPermPage]

在“人”视图上方,我需要为当前登录用户添加与其关联的useroption值。UserOption模型具有用户和人。

{
  "id": 151,
  "name": "Emma Watson",
  "nationality": "USA",
  ”option”: “True”.   ##This is what needs to be added
}

这真的非常复杂,我还没有找到任何答案。请指教。

django
1个回答
0
投票

您可以使用额外的属性注释查询集:

from django.db.models import Exists, OuterRef

class PersonViewSet(viewsets.ModelViewSet):
    model = apis_models.Person
    serializer_class = apis_serializers.PersonSerializer
    permission_classes = [HasPermPage]

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).annotate(
            option=Exists(
                apis_models.UserOption.objects.filter(
                    user_id=self.request.user,
                    person_id=OuterRef('pk'),
                    option='monitor'
                )
            )
        )

在序列化程序中,您应该添加option字段:

class PersonSerializer(serializers.ModelSerializer):
    option = serializers.BooleanField(read_only=True)

    class Meta:
        model = apis_models.Person
        fields = ('id', 'name', 'nationality', 'option')
© www.soinside.com 2019 - 2024. All rights reserved.