def pre_save(self, obj):
"""
Set any attributes on the object that are implicit in the request.
"""
# pk and/or slug attributes are implicit in the URL.
lookup = self.kwargs.get(self.lookup_field, None)
pk = self.kwargs.get(self.pk_url_kwarg, None)
slug = self.kwargs.get(self.slug_url_kwarg, None)
slug_field = slug and self.slug_field or None
if lookup:
serializer = self.get_serializer()
k = serializer.get_fields()[self.lookup_field]
queryset = self.get_queryset()
queryset = self.filter_queryset(queryset)
if isinstance(k, serializers.HyperlinkedRelatedField):
filter = {}
lookup_field = '%s__%s' % (self.lookup_field, k.lookup_field)
filter[lookup_field] = lookup
k_obj = get_object_or_404(queryset, **filter)
lookup = getattr(k_obj, self.lookup_field)
setattr(obj, self.lookup_field, lookup)
if pk:
setattr(obj, 'pk', pk)
if slug:
setattr(obj, slug_field, slug)
# Ensure we clean the attributes so that we don't eg return integer
# pk using a string representation, as provided by the url conf kwarg.
if hasattr(obj, 'full_clean'):
exclude = mixins._get_validation_exclusions(
obj, pk, slug_field, self.lookup_field)
obj.full_clean(exclude)
评论列表
文章目录