在Django Rest Framework中设置slug和用户时创建模型

时间:2015-10-07 14:32:29

标签: django serialization django-rest-framework

我有一个模型,我使用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

2 个答案:

答案 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做类似的事情。