如何 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 实例,这样用户可以看到名称。
我正在为后端开发 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 实例,这样用户可以看到名称。