【发布时间】:2017-10-06 18:32:13
【问题描述】:
使用 Django REST 框架,我想允许用户通过ListCreateAPIView(通过POST)创建和保存 Django 模型的实例。其中一个字段(称为domain 的外键字段)应根据urls.py 中定义的视图参数确定。
此外,用户可以稍后使用PUT 或PATCH 对RetrieveUpdateDestroyAPIView 端点的请求修改模型实例(使用相同的序列化程序)。我不希望用户此时能够修改domain 字段。
虽然我已经准备好模型和视图/序列化器结构的代码,但我不确定如何告诉序列化器根据视图参数确定domain 字段的值。这是我得到的:
class RRset(models.Model):
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(null=True)
domain = models.ForeignKey(Domain, on_delete=models.CASCADE, related_name='rrsets')
subname = models.CharField(max_length=255, blank=True)
type = models.CharField(max_length=10)
...和一个直截了当的ListCreateAPIView:
class RRsetsDetail(generics.ListCreateAPIView):
serializer_class = RRsetSerializer
permission_classes = (permissions.IsAuthenticated,)
def get_queryset(self):
name = self.kwargs['name']
return RRset.objects.filter(domain__name=name, domain__owner=self.request.user.pk)
urls.py 包含以下行:
url(r'^domains/(?P<name>[a-zA-Z\.\-_0-9]+)/rrsets/$', RRsetsDetail.as_view(), name='rrsets')
这允许用户使用RRsetsSerializer 序列化程序列出和创建RRset 对象(列出name 字段只是为了完整性,但我认为它在这种情况下并不重要):
class RRsetSerializer(serializers.ModelSerializer):
name = serializers.SerializerMethodField()
def get_name(self, obj):
return '.'.join(filter(None, [obj.subname, obj.domain.name])) + '.' # returns 'subname.name.'
class Meta:
model = RRset
fields = ('created', 'updated', 'domain', 'name', 'type',)
read_only_fields = ('created', 'updated', 'domain', 'type',)
问题:
- 我需要修改哪些内容才能让序列化程序从视图
name参数中获取domain名称? - 序列化程序的
read_only_fields设置可防止用户稍后修改domain字段。但是,我不确定此设置是否以某种方式与尝试设置默认值的序列化程序交互(即使设置了只读,序列化程序也可以写入默认值)?
总结一下:我正在寻找类似于“具有基于视图参数的默认值的一次性写入字段”。
【问题讨论】:
标签: python django serialization django-rest-framework