【问题标题】:Related field id in POST request in Django Rest FrameworkDjango Rest Framework中POST请求中的相关字段ID
【发布时间】:2018-04-02 10:02:57
【问题描述】:

我正在创建仅具有相关字段 id 的对象。我已经搜索了很多,但无法得到答案。这是我的代码

models.py:

class Resturant(models.Model):
    name = models.CharField(_('name'), max_length=100)

class Menu(models.Model):
    resturant_id = models.OneToOneField(Resturant, related_name='resturant', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now=True)

serializers.py:

class MenuSerializer(serializers.ModelSerializer):
    resturant_id = serializers.PrimaryKeyRelatedField(read_only=True)

    class Meta:
        model = Menu
        fields = ['id', 'created_at', 'resturant_id']

views.py:

class CreateMenuAPIView(APIView):

    def post(self, request, *args, **kwargs):
        serializer = MenuSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(status=status.HTTP_400_BAD_REQUEST)

我在 POST 请求中发送 { "resturant_id": 2 } 时收到此错误。

DETAIL:  Failing row contains (14, 2018-04-02 09:36:43.261849+00, null).
The above exception (null value in column "resturant_id" violates not-null constraint

任何帮助将不胜感激!

【问题讨论】:

  • 分享更多错误引用?
  • 查看编辑后的帖子

标签: python django django-models django-rest-framework django-views


【解决方案1】:

您可以覆盖方法 create 以查找 Restaurant 对象或如果不存在则创建。并且只编辑序列化程序。

serializer.py

  class MenuSerializer(serializers.ModelSerializer):
      resturant_id = serializers.PrimaryKeyRelatedField(read_only=True)

      class Meta:
          model = Menu
          fields = ['id', 'created_at', 'resturant_id']

      def create(self, validated_data):
        id_param = validated_data.pop('resturant_id')
        resturant = Resturant.objects.get_or_create(id=id_param)[0]
        menu = Menu.objtects.create(resturant_id=resturant.id)
        return menu

如果不行你可以删除这一行:

resturant_id = serializers.PrimaryKeyRelatedField(read_only=True)

【讨论】:

    【解决方案2】:
    returant_id = serializers.PrimaryKeyRelatedField(read_only=True)
    

    你可以尝试给 read_only=False

    你能检查一下拼写吗? returant_id 用于序列化程序字段,缺少's'。 'resturant_id' 用于字段列表

    【讨论】:

    • 你能检查一下拼写吗,returant_id 用在 meta 中,'s' 不见了。 'resturant_id' 用于字段。
    【解决方案3】:

    您正在使用模型序列化程序并已覆盖“returant_id”。

    class MenuSerializer(serializers.ModelSerializer):
        returant_id = serializers.PrimaryKeyRelatedField(queryset=Resturant.objects.all())
    

    【讨论】:

      【解决方案4】:

      尝试将序列化器更改为

      class MenuSerializer(serializers.ModelSerializer):
          resturant_id = serializers.PrimaryKeyRelatedField()
      
          class Meta:
              model = Menu
              fields = ['id', 'created_at', 'resturant_id']
      

      如果read_only=True 则不会写入数据库。

      【讨论】:

      • 分享您在请求中发送的数据
      猜你喜欢
      • 2019-11-20
      • 2021-07-09
      • 2023-01-08
      • 2016-12-12
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      相关资源
      最近更新 更多