【发布时间】:2021-07-14 05:15:51
【问题描述】:
使用 Django REST Framework (DRF),我正在尝试遵循 this link 提供的嵌套序列化程序的 DRF 文档。目前,假设我的代码如下所示:
models.py
class PvlEntry(models.Model):
pvl_project = models.OneToOneField("review.ProjectList", on_delete=models.CASCADE, related_name='pvl_project')
pvl_reviewer = models.ForeignKey('auth.User', on_delete=models.CASCADE, related_name='+')
pvl_worktype_is_correct = models.BooleanField(blank=False, null=False)
pvl_hw_description = models.TextField(blank=False, null=False)
class ProjectList(models.Model):
"""
"""
project_number = models.IntegerField(blank=False, null=False, unique=True)
project_manager = models.CharField(blank=False, max_length=255, null=False)
project_name = models.CharField(blank=False,
max_length=255,
null=False)
project_description = models.CharField(blank=True,
max_length=1024,
null=True)
views.py
class PvlEntryListCreateAPIView(ListCreateAPIView):
""" This view is leveraged for jsGrid so that we can have jsGrid produce
a JavaScript enabled view for actions like editing and filtering of
the project vetting list.
"""
queryset = PvlEntry.objects.all()
serializer_class = PvlEntrySerializer
name = 'listcreate-pvlentry'
def get_queryset(self):
qs = self.queryset.all()
return qs
class PvlEntryRetrieveUpdateDestroyAPIView(RetrieveUpdateDestroyAPIView):
""" Leveraged for jsGrid
"""
queryset = PvlEntry.objects.all()
serializer_class = PvlEntrySerializer
name = 'rud-pvlentry'
serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = [
'id',
'first_name',
'last_name',
'email'
]
class ProjectListSerializer(serializers.ModelSerializer):
class Meta:
model = ProjectList
fields = '__all__'
class PvlEntrySerializer(serializers.ModelSerializer):
pvl_project = ProjectListSerializer()
pvl_reviewer = UserSerializer()
def update(self, instance, validated_data):
print(validated_data)
return super(PvlEntrySerializer, self).update(self, instance, validated_data)
class Meta:
model = PvlEntry
fields = '__all__'
现在,我了解到,由于这段代码位于现在,它不是可写的序列化程序。但是,有了上面的代码,我至少不应该通过序列化程序对数据的验证吗?
使用 DRF 可浏览 API,当我尝试使用 RetriveUpdateDestroy 内置 API 视图的 PUT 操作时,我收到类似于以下内容的错误:
PUT /pvl/grid/11
HTTP 400 Bad Request
Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"pvl_project": {
"project_number": [
"pvl entry with this project number already exists."
]
}
}
再次,我知道我无法像现在这样对代码执行更新 (PUT),但它至少不应该通过序列化/验证阶段吗?我也没有创建新记录。我只是试图执行更新。那么,验证为什么要关注“具有此项目编号的 pvl 条目”是否已经存在?
stackoverflow 上有很多帖子涉及或围绕这个问题展开讨论,但由于某种原因,我无法依靠其中任何一个来解决问题。
我也尝试返回并用PrimaryKeyRelatedFields 替换嵌套的序列化程序,但这种方法不会返回相关数据,只返回对相关数据的引用。
我也尝试过使用单独的序列化程序,但这种方法不适用于我为使用模板中的数据而实现的 jsGrid JavaScript。
肯定有一个简单的解决方案?
【问题讨论】:
标签: django django-rest-framework