【问题标题】:Django rest framework save object issuesDjango rest框架保存对象问题
【发布时间】:2013-10-24 12:00:40
【问题描述】:

分析

总之,以下应该可以工作,下面给出了一个解决方案。我已经留下了这个问题,以防其他人迷路。

原始问题

在 Django M2M 教程中,我们有披萨和配料。作为我的应用程序的一部分,我有 M2M 字段的浇头和添加新浇头的端点。但是,我只想添加不存在的浇头,否则我只想返回现有的浇头。这是为了避免 Pizzas 和 Toppings 之间的嵌套 M2M 关系导致问题,而是我有两个端点,一个用于比萨饼,一个用于浇头,然后在视图中添加浇头 post_save

但是,以下似乎不起作用:

class ToppingSerializer(serializers.ModelSerializer):
    another_model = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = Topping
        fields = ('id', 'another_model', 'name')

    def save_object(self, obj, **kwargs):
        topping = Topping.objects.get_or_create(another_model=obj.another_model,
                                                name=obj.name)
        return topping

查看代码如下:

    [snip - View code below]
    serializer_class = ToppingSerializer

    serializer = self.get_serializer(data=request.DATA, many=True)
    if serializer.is_valid():
        serializer.save()
        return Response(status=status.HTTP_201_CREATED)
    [snip]

【问题讨论】:

    标签: python django rest django-rest-framework


    【解决方案1】:

    我认为你需要改变你的句子并在“serializer.objects”的末尾添加“.all()”:

    for topping in ToppingSerializer.objects.all():
        print topping.id
    

    注意大写字母。要获取一个类的所有对象,您需要调用该类。如果你定义像 ToppingSerializer 这样的类,要获取该类的所有对象,你必须调用“ToppingSerializer.objects.all()”,然后你会得到一个对象列表作为返回。

    【讨论】:

    • 我正在使用 Django Rest Framework 的序列化程序来序列化 Django 对象。 Topping 是一个 Django 对象,因此 Topping.objects.all() 确实会返回一个浇头列表。我想要的是来自序列化程序的验证后、保存后的对象列表,存储在 serializer.object 中,似乎正在丢弃 ID,我不知道为什么。
    【解决方案2】:

    总而言之,以上应该可以工作,因为 save() 和 save_object() 调用是在 self.object 上调用的,并且不返回任何内容。因此,应该预期上述方法不起作用。相反,在覆盖的 save() 方法中迭代 self.object 列表,并用它替换预保存的 self.object 列表,就可以了。

    下面是一个例子:

    def save(self, **kwargs):
        """
        Unintelligent save via get_or_create(). This does not handle logic
        for adding/removing toppings from parent (read pizza) models. It 
        merely puts new toppings into the database.
        """
        # Clear cached _data, which may be invalidated by `save()`
        self._data = None
    
        if isinstance(self.object, list):
            saved_mappings = [Topping.objects.get_or_create(another_model=item.another_model, name=item.name)[0] for item in self.object]
        else:
            saved_mappings = Topping.objects.get_or_create(another_model=self.object.another_model, name=self.object.name)
    
        self.object = saved_mappings
    
        return self.object
    

    【讨论】:

      猜你喜欢
      • 2018-09-02
      • 2022-07-22
      • 2017-01-17
      • 1970-01-01
      • 2014-05-21
      • 2018-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多