此外,用户可以稍后使用对RetrIEveUpdateDestroyAPIVIEw端点的PUT或PATCH请求(使用相同的序列化程序)修改模型实例.我不希望用户此时能够修改域字段.
虽然我已准备好模型的代码和视图/序列化器结构,但我不知道如何告诉序列化程序根据视图参数确定域字段的值.这是我得到的:
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对象(名称字段仅为完整性而列出,但我不认为它在此上下文中很重要):
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',)
问题:
>我需要修改什么才能让序列化程序从视图名称参数中获取域名?
>序列化程序的read_only_fIElds设置可防止用户稍后修改域字段.但是,我不确定此设置是否以某种方式与序列化程序交互尝试设置默认值(即使设置了只读,串行器是否可以写入默认值)?
总结一下:我正在寻找的是“具有基于视图参数的默认值的一次写入字段”.
解决方法 我认为你正在寻找 HiddenField与 CreateOnlyDefault的组合HIDdenFIEld
A fIEld class that does not take a value based on user input,but instead takes its value from a default value or callable.
CreateOnlyDefault
A default class that can be used to only set a default argument during
create operations. During updates the fIEld is omitted.It takes a single argument,which is the default value or callable
that should be used during create operations.
而且因为你想访问视图,你不能只使用callable,但你必须使用Class-based callable,它可以访问上下文数据.
class DomainDefault(object): def set_context(self,serializer_fIEld): vIEw = serializer_fIEld.context['vIEw'] request = serializer_fIEld.context['request'] self.domain = ...#determine the domain based on request+vIEw def __call__(self): return self.domainclass RRsetSerializer(serializers.ModelSerializer): domain = serializers.HIDdenFIEld(default=serializers.CreateOnlyDefault(DomainDefault()))总结
以上是内存溢出为你收集整理的在Django序列化程序中,如何根据视图参数设置外键字段?全部内容,希望文章能够帮你解决在Django序列化程序中,如何根据视图参数设置外键字段?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)