【问题标题】:how to get submit a foreign key into a form post? python /django如何将外键提交到表单帖子中?蟒蛇/django
【发布时间】:2017-06-11 09:24:02
【问题描述】:

其实我没有表单,我目前正在使用ViewSet创建API。

我有两个模型,一个是普通用户模型,一个是组模型,它使用一个名为 creator 的字段和外键给用户

我创建了一个序列化程序,然后用它来验证 POST 输入,不知何故我不断收到错误提示

null value in column "creator_id" violates not-null constraint

我可以理解并且我也测试过这是因为creator_id 在我尝试发布时为空,但我确实输入了creator_id。我是否以错误的方式输入它,或者我如何获取外键以保存它?

我的组模型是这样的

class Group(Model):
    creator = ForeignKey(User,
                         null=True,  // I used this to test I am right with the error
                         blank=True,  // I used this to test I am right with the error
                         on_delete=CASCADE,
                         related_name="%(class)ss",
                         related_query_name="%(class)s")
    group_name = CharField(max_length=256, unique=True)
    created_at = DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return self.group_name

再次,我添加null=True, blank=True 是因为我想看看我是否正确,这是因为creator_id 不能为空,是的,我是对的,添加这两个字段后,我没有得到错误了。

我的 GroupSerializer

class GroupSerializer(ModelSerializer):
    group_id = SerializerMethodField()
    creator_name = SerializerMethodField()
    creator_id = SerializerMethodField()

    class Meta:
        model = Group
        fields = ['group_id', 'group_name', 'creator_id', 'creator_name']

    def get_group_id(self, obj):
        return obj.id

    def get_creator_name(self, obj):
        return obj.creator.tutor_name

    def get_creator_id(self, obj):
        return obj.creator.id

    def create(self, validated_data):
        return Group.objects.create(**validated_data)

我的观点.py

    @csrf_exempt
    def create(self, request):
        data = GroupSerializer(data=request.data)  // this would return the `group_name` and `creator_id` I entered
        if data.is_valid():  // this would return true
            data.save()
            return Response({'status': True})
        return Response({'status': False, 'message': data.errors}, status=400)

我尝试使用...发帖

    {
        "group_name": "bridge",
        "creator_id": 1
    }

试过"creator_id": "1""creator": "1"

仍然出现同样的错误...

我该如何解决这个问题?

提前致谢

【问题讨论】:

    标签: python mysql django foreign-key-relationship


    【解决方案1】:

    我认为您声明您的序列化程序错误。您正在使用 ModelSerializer,但您在字段列表中声明的字段与模型的字段不匹配。另请注意,fields 是一个列表,而不是一个数组。我觉得应该是这样的。

    class Group(Model):
        creator = ForeignKey(User,
                             on_delete=CASCADE,
                             related_name="%(class)ss",
                             related_query_name="%(class)s")
        group_name = CharField(max_length=256, unique=True)
        created_at = DateTimeField(auto_now_add=True)
    
        def __unicode__(self):
            return self.group_name
    
    class GroupSerializer(ModelSerializer):
        class Meta:
            model = Group
            fields = ('creator', 'group_name', 'created_at')
    

    我也知道你这样做是为了测试,但在同一字段上同时声明 null=Trueblank=True 被认为是不好的做法。它应该是其中之一。

    在此处查看文档:http://www.django-rest-framework.org/api-guide/serializers/#modelserializer

    【讨论】:

    • 我能理解你的意思,但是如果我想把 creator 改成 creator_id 怎么办?这就是我卡住的地方。假设我知道模型使用'group_name`,但如果我想通过SerializerMethodField 将其更改为g_name
    • 在你的模型中,creator 是一个外键。所以在 Django 中,它实际上并不是指一个 id 号,而是对另一个模型的引用(在本例中为 User)。该模型有自己的id 字段。如果你想要creator_id,它实际上是creator.id,因为它指的是User模型id字段。
    • 这就是为什么我有def get_creator_id(self, obj):return obj.creator.id,然后将其输入到序列化程序的fields 中,或者我怎样才能获得创建者的ID?
    猜你喜欢
    • 2023-04-01
    • 2011-10-20
    • 1970-01-01
    • 2020-12-30
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2018-10-28
    相关资源
    最近更新 更多