2015-10-07 73 views
2

我有一个使用django rest框架创建实例的模型。序列化器会报告一个丢失的slug和一个空的ForeignKey字段,该字段应该指向用户。创建模型,同时在Django Rest Framework中设置slu and和用户

我想在我的串行器来设置这些值来覆盖perform_create,但我意识到,在标准CreateModelMixin:

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() 

方法is_valid()perform_create()之前被调用。因此,为用户填充外键并添加段塞不起作用。

有没有正确的方法来解决这个问题,或者我应该重写create

更新:

有人问我@Rahul古普塔补充型号和序列化。在这里,他们是:

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实例。但是用户不会输入shopslug,因为这些是自动确定的。 S is来自不同模型的名称和商店,链接到request.user

+0

请为模型以及串行化器添加代码。 –

+0

嗨@RahulGupta,我添加了模型,序列化和一些更多的信息。 –

+0

@RahulGupta,我发现了这个问题。我会写一个答案。 –

回答

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) 

评论“我加了这条线”是在我添加功能的原始方法的行。它完成这项工作,但可能会有更优雅的解决方案。类似的东西可以做为slu。。

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) 
相关问题