【问题标题】:Override create() method in ModelSerializer and get object by ID (Django 3.2)覆盖 ModelSerializer 中的 create() 方法并按 ID 获取对象(Django 3.2)
【发布时间】:2022-02-09 16:45:00
【问题描述】:

主模型

class Main(models.Model): 
   title = models.CharField(max_length=255) 
   event = models.ForeignKey('Event', null=True, on_delete=models.CASCADE)

事件模型

class Event(models.Model):
   day = models.DateField(u'Day of the event', help_text=u'Day of the event', null=True)

JSON 结构示例:

{    
   "titre": "main",
   "event": {
        "id": 13, #can't filter or get object by id
        "day": "2022-01-30"
    }
}

在序列化器中重写 create():

class MainSerializer(serializers.ModelSerializer): 
    event = EventSerializer()

    class Meta: 
        model = Main
        fields = '__all__'

    def create(self, validated_data):
        event_data = validated_data.pop('event')
        event = Event.objects.get(id=event_data['id'])
        main = Main.objects.create(event=event, **validated_data)
        return main

事件序列化器:

class EventSerializer(serializers.ModelSerializer): 

class Meta: 
    model = Event
    fields = '__all__'

所以我遇到错误“KeyError id”,无法添加对象。

【问题讨论】:

  • 你检查了create()方法中是否有event_data
  • 我正在使用这种情况,但由于我无法访问 event_data['id'] 它不起作用:if Event.objects.filter(id = event_data['id']).exists(): 当我尝试例如 event = Event.objects.get(id=13) 它工作正常。所以我认为问题在于访问事件主键。
  • 你能分享你的EventSerializer吗?
  • @BrianDestura 我刚刚添加了 EventSerializer
  • 尝试使用id = serializers.IntegerField()明确添加id字段

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


【解决方案1】:

解决方案非常简单:只需将此行添加到 EventSerializer

id = serializers.IntegerField(required=False)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-13
    • 2015-08-19
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2010-10-28
    相关资源
    最近更新 更多