首页 > 解决方案 > 如何使用 PrimaryKeyRelatedField 在 ModelSerializer 中将所有者重命名为 owner_id?

问题描述

我想将我的owner字段重命名为,owner_id因为它没有嵌套,并且只包含所有者的 ID。我做了一些尝试,但收到诸如{"owner":["This field is required."]}.

这是我的serializers.py:

class UserJobApplicantSerializer(serializers.ModelSerializer):
    job_id = serializers.PrimaryKeyRelatedField(source='job', queryset=Job.objects.all())
    owner_id = serializers.PrimaryKeyRelatedField(
        source='owner',
        read_only=True,
        default=serializers.CurrentUserDefault()
    )

    class Meta:
        model = JobApplicant
        fields = [
            'id',
            'job_id',
            'owner_id',
            'timestamp',
        ]
        read_only_fields = ['id',]

视图覆盖perform_create并将 注入owner_idvalidated_data

class UserJobApplicantAPIView(generics.ListCreateAPIView):
    lookup_field = 'pk'
    serializer_class = UserJobApplicantSerializer
    permission_classes = (IsAuthenticated,)

    def get_queryset(self):
        return JobApplicant.objects.filter(owner=self.request.user)

    def perform_create(self, serializer):
        serializer.validated_data['owner_id'] = self.request.user.id
        return super(UserJobApplicantAPIView, self).perform_create(serializer)

模型(Job 模型持有 ManyToManyField 和 through='JobApplicant'):

class JobApplicant(models.Model):   
    owner = models.ForeignKey(settings.AUTH_USER_MODEL,
            on_delete=models.CASCADE)
    job = models.ForeignKey(Job, on_delete=models.CASCADE)
    timestamp = models.DateTimeField(auto_now_add=True)                                                                                      

    class Meta:
        unique_together = ('owner', 'job')                                                                                               

    def __str__(self):
        return "{}: {}".format(self.job.display_name, self.owner.email)  

这样做的正确方法是什么?是否可以使用PrimaryKeyRelatedField,或者我需要使用其他类型的字段(或自定义)?我让它工作,job_idjob_id由于它是由用户提供的,所以有所不同。

我将 DRF 3.8.2 与 Django 1.11.15 一起使用。

标签: djangodjango-rest-framework

解决方案


从解决主要问题中删除read_only=True,论点:) 应该是,PrimaryKeyRelatedField

from django.contrib.auth.models import User  # use the AUTH_USER_MODEL here

owner_id = serializers.PrimaryKeyRelatedField(source='owner', queryset=User.objects.all(), default=serializers.CurrentUserDefault())


注意:您不想重写perform_create()将用户实例传递给序列化程序的方法。CurrentUserDefault()如果您正确登录,班级将管理这些事情


推荐阅读