我有一个模型,我使用django rest框架创建一个实例。序列化程序抱怨一个丢失的slug和一个应该指向User的空的ForeignKey-Field。
我试图在序列化程序中覆盖bonjour
来设置这些值,但我意识到在标准的CreateModelMixin中:
bonjour
在perform_create
之前调用方法class CreateModelMixin(object):
"""
Create a model instance.
"""
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer):
serializer.save()
。因此,为用户填充外键并添加slug不起作用。
是否有正确的方法可以解决此问题,还是应该覆盖is_valid()
?
更新
@Rahul Gupta要求我添加模型和序列化程序。他们在这里:
perform_create()
和
create
我应该让自己更清楚一些。在浏览器中,用户填写表单以创建新的class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields=('id','name','slug',..., 'shop','category')
实例。但是,用户不会输入class Product(models.Model):
name = models.CharField(max_length=255)
slug = models.SlugField(max_length=255)
shop = models.ForeignKey(Shop)
category = models.ForeignKey("Category")
def __unicode__(self):
return self.name
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Product, self).save(*args, **kwargs)
或Product
,因为这些是自动确定的。 Slug来自不同模型的名称和商店,链接到shop
。
答案 0 :(得分:2)
您不必从父类复制和粘贴代码,只需调用super
以借用父代create
方法的功能:
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all().order_by('name')
serializer_class = ProductSerializer
def create(self, request, *args, **kwargs):
request.data['shop'] = drequest.user.shop.id
# Everything above is from Sebastian Langer's answer
# difference is below: just call parent's `create`:
return super(ProductViewSet, self).create(request, *args, **kwargs)
答案 1 :(得分:1)
所以我自己回答这个问题。我做了一些相当愚蠢的事情 - 我认为我必须覆盖序列化程序中的create方法,因为它似乎是我必须覆盖的ViewSet中的方法。以下是为我做的代码:
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all().order_by('name')
serializer_class = ProductSerializer
def create(self, request, *args, **kwargs):
request.data['shop']=request.user.shop.id # <-- I ADDED THIS LINE
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
评论&#34;我添加了这条线&#34;是我在原始方法中添加功能的行。它完成了这项工作,但可能会有更优雅的解决方案。可以为slug做类似的事情。