我有以下两种型号,
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
}
这真的非常复杂,我还没有找到任何答案。请指教。
您可以使用额外的属性注释查询集:
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')