使用Django REST框架,我希望允许用户通过ListCreateAPIView
(通过POST
)来创建和保存Django模型的实例。其中一个字段(外键字段称为domain
)应根据urls.py
中定义的视图参数确定。在
此外,用户可以稍后使用PUT
或PATCH
请求对RetrieveUpdateDestroyAPIView
端点(使用相同的序列化程序)修改模型实例。我不希望用户此时能够修改domain
字段。在
虽然我已经准备好了模型和视图/序列化程序结构的代码,但我不确定如何告诉序列化程序根据view参数确定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
:
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
字段。但是,我不确定此设置是否与试图设置默认值的序列化程序交互(即使设置了只读,序列化程序是否可以写入默认值)?在总而言之:我要找的是类似于“write once字段,该字段具有基于视图参数的默认值”。在
我想你要找的是HiddenField和CreateOnlyDefault的组合
因为您想访问视图,所以不能只使用callable,而是必须使用可以访问上下文数据的Class-basedcallable。在
相关问题 更多 >
编程相关推荐