django - 如何使用 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_id
到validated_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_id
但job_id
由于它是由用户提供的,所以有所不同。
我将 DRF 3.8.2 与 Django 1.11.15 一起使用。
解决方案
从解决主要问题中删除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()
如果您正确登录,班级将管理这些事情