【问题标题】:Django rest ModelViewSet serializer create failsDjango rest ModelViewSet 序列化程序创建失败
【发布时间】:2018-06-14 06:03:57
【问题描述】:

我有两个具有以下关系的模型:

class Library(models.Model):
    library_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=30)
    ...

class Reader(models.Model):
    user = models.OneToOneField(User)
    phone = models.CharField(max_length=30)
    ...
    # A library has many readers
    which_library = models.ForeignKey('Library', related_name='readers', on_delete=models.CASCADE)

我已将序列化程序定义如下(我在为特定库创建阅读器时直接创建用户):

class ReaderSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.username')
    email = serializers.CharField(source='user.email')
    password = serializers.CharField(source='user.password')

    class Meta:
        model = Reader
        #fields = '__all__'
        depth = 1
        fields = ('id', 'username', 'email', 'password', 'phone', 'address', 'dob', 'which_library')


    def create(self, validated_data):
        user_data = validated_data.pop('user')
        user = User.objects.create(**user_data)
        user.set_password(user_data['password'])
        user.save()
        reader = Reader.objects.create(user=user, **validated_data)
        return reader

我正在编写一个 ModelViewSet 如下:

class ReaderViewSet(viewsets.ModelViewSet):

serializer_class = ReaderSerializer

def get_queryset(self):

    readers = Reader.objects.filter(which_library=self.kwargs.get('library_id'))
    return readers

网址:router.register(r'readers/(?P<library_id>[0-9]+)', ReaderViewSet, base_name='readers')

我的 GET 调用成功,我在特定库中获得了所有读者。

我正在使用以下 JSON 数据进行 POST 调用:

{
    "username": "three",
    "email": "three@gmail.com",
    "password": "5647",
    "phone": "836365",
    "address": "sample6 address",
    "which_library": "2"
}

并且还通过删除“which_library”但都给我错误:

IntegrityError at /api/readers/2/
(1048, "Column 'which_library_id' cannot be null")

我做错了什么?

【问题讨论】:

    标签: django django-rest-framework django-rest-viewsets


    【解决方案1】:

    尝试删除depth = 1 选项。来自docs:

    默认的 ModelSerializer 使用主键来表示关系,但您也可以使用深度选项轻松生成嵌套表示。

    看起来使用此选项序列化程序需要对象而不是 id。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      相关资源
      最近更新 更多