【问题标题】:Django Restframework update manytomany via through tableDjango Rest Framework 通过表更新多对多
【发布时间】:2014-07-30 09:23:04
【问题描述】:

我有以下模型和另一个 ClientWarehouse。由于某些原因,我必须通过名为 RouteInfo 的直通表创建 ManyToManyField 关系

class Route(models.Model):
    user = models.ForeignKey(User)
    warehouse = models.ManyToManyField(ClientWarehouse,
                                       verbose_name='Warehouse Location',
                                       through='RouteInfo',
                                       blank=True, null=True)

class RouteInfo(models.Model):
    route = models.ForeignKey(Route)
    warehouse = models.ForeignKey(ClientWarehouse)

我有以下序列化程序类编写器

class RouteInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = RouteInfo


class RouteSerializer(serializers.ModelSerializer):
    warehouse = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    class Meta:
        model = Route

以及关注视图集

class RouteViewSet(viewsets.ModelViewSet):
    model = Route

    def get_object(self, pk):
        try:
            return Route.objects.get(pk=pk)
        except Route.DoesNotExist:
            raise Http404

    def create(self, request, format=None):
        r = RouteSerializer(data=request.DATA)
        if r.is_valid():
            r.save()
            return Response(r.data, status=status.HTTP_201_CREATED)
        return Response(r.errors, status=status.HTTP_400_BAD_REQUEST)

但是,在浏览 DRF 的文档时,我发现它不支持通过表对 ManytoManyField 进行写操作。

目前,当我尝试通过 api 调用保存路由时,它不会保存客户端仓库,即未创建 RouteInfo 表,但创建的 Route 对象中没有客户端仓库。

有什么方法可以在路由表中创建路由时更新直通表,即 RouteInfo。

【问题讨论】:

    标签: django serialization django-rest-framework django-orm


    【解决方案1】:

    另外,我发现我可以通过首先保存路由实例并使用 Route.id 和仓库保存到 RouteInfo 模型来完成相同的操作。

    因此,这变成了两步过程。先保存原模型,再保存直通模型。

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 2013-10-24
      • 2018-07-28
      • 2020-11-18
      • 2015-09-21
      • 1970-01-01
      相关资源
      最近更新 更多