如何 post 使用只有一个字段的 django rest 框架的带有外键的模型?

how to post a model with a foreignkey using django rest framework with only one field?

我正在为后端开发 API,django rest 框架并在前端做出反应。 我只想创建一个模型并将外键作为下拉列表传递,就像在 django rest 框架中一样 但是用reactjs 我有很多模型,没有外键的模型很容易被操纵 但我有一些带有外键的模型,我可以获得但不能 POST 即使有邮递员我也得到:

"name": [
        "This field is required."
    ]

我看到很多帖子都有同样的问题,但我不明白怎么去实现它 这是一个带有外键的简单模型

models.py

class SalleSport(models.Model):
    name    = models.CharField( max_length=50)
    adresse = models.CharField( max_length=50)

class Planning(models.Model):
    name            = models.CharField(max_length=50)
    salle_sport     = models.ForeignKey(SalleSport, verbose_name="Salle de sport", on_delete=    
models.CASCADE, null=True, blank=True)

serializers.py

class SalleSportSerialiser(serializers.ModelSerializer):
    class Meta:
        model = SalleSport
        fields= '__all__'

因为我想创建一个 Planning 实例,所以我尝试了很多没有用的解决方案,我将把它们作为评论

class PlanningSerialiser(serializers.ModelSerializer):
    # salle_sport = SalleSportSerialiser(read_only=False)

    class Meta:
        model = Planning
        fields= '__all__'
        # fields= ('id', 'name', 'salle_sport')

    # def create(self, validated_data):
    #     salle_sport = validated_data.pop('salle_sport', None)
    #     if author_data:
    #         salle_sport = SalleSport.objects.get_or_create(**salle_sport)[0]
    #         print('salle de sport',salle_sport)
    #         validated_data['salle_sport'] = salle_sport
    #     return Planning.objects.create(**validated_data)


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

    # def to_representation(self, instance):
    #     # response = super(PlanningSerialiser, self).to_representation(instance)
    #     self.fields["salle_sport"] = SalleSportSerialiser(read_only=True)
    #     return super(PlanningSerialiser, self).to_representation(instance)


    # def get_salle_sport(self, obj):
    #     return SalleSportSerialiser(instance=obj.salle_sport).data

我还尝试通过重写 create()

views.py 上实现它
class PlanningAPIView(generics.CreateAPIView):
    queryset = Planning.objects.all()
    serializer_class = PlanningSerialiser

    # def create(self, request):
    #     salle_sport = get_object_or_404(SalleSport, name=request.data.get('salle_sport'))
    #     serializer = self.get_serializer(data= request.data)
    #     serializer.is_valid(raise_exception=True)
    #     serializer.save(salle_sport=salle_sport)
    #     headers = self.get_success_headers(serializer.data)

    #     return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

我已经阅读了有关嵌套序列化器的文档,但我不知道如何让它工作。

尝试

class PlanningSerialiser(serializers.ModelSerializer):
    salle_sport = SalleSportSerialiser(read_only=False)

    class Meta:
        model = Planning
        fields= ('salle_sport',)

我找到了解决方案,在这里我必须提供一个序列化器来编写,另一个来读取以获得我想要的一切:

这个序列化器是通过名称获取 SalleSport 并用它来读取

class NameSalleSportSerialiser(serializers.ModelSerializer):
 
    class Meta:
        model = SalleSport
        fields= ('name',)



class PlanningListSerialiser(serializers.ModelSerializer):
    salle_sport = NameSalleSportSerialiser()
    class Meta:
        model = Planning
        fields= ('name', 'salle_sport')

这是我用来创建嵌套模型(带外键)的序列化程序

class PlanningSerialiser(serializers.ModelSerializer):
    salle_id = serializers.PrimaryKeyRelatedField(queryset= SalleSport.objects.all(), source='salle_sport.id')
    class Meta:
        model = Planning

        fields= ('name', 'salle_id')
 

    def create(self, validated_data):
       
        plan = Planning.objects.create(salle_sport=validated_data['salle_sport']['id'], name=validated_data['name'])

        return plan

在 React 方面,我获取了一个 GET 请求来检索所有显示名称但 post ID 的 SalleSport 实例,这样用户可以看到名称。