【问题标题】:How to map foreign key when serializing POST data?序列化POST数据时如何映射外键?
【发布时间】:2016-03-08 16:27:46
【问题描述】:

在通过序列化程序创建新对象时,我试图将外键映射到 POST 数据。对象中有两个外键,一个是完美序列化,一个是创建错误。

型号:

class Event(models.Model):
    owner = models.ForeignKey('auth.User', related_name='owner', blank=True)
    date = models.DateField('eventdate')
    time = models.TimeField('eventtime', default=now)
    eventtype = models.ForeignKey(EventType, related_name='eventtype', blank=True)
    # duration = models.DurationField()
    location = models.CharField(max_length=200, blank=True)

    attenders = models.ManyToManyField(User, related_name='attenders')
    invited = models.ManyToManyField(User, related_name='invitedlist')

查看:

class EventMixin(RetrieveUpdateDestroyAPIView, CreateAPIView):
    serializer_class = EventSerializer

    def get_queryset(self):
        return Event.objects.all()

    def partial_update(self, request, *args, **kwargs):
        request['owner'] = request.user
        sname = request['eventtype']
        request['eventtype'] = EventType.objects.filter(sname=sname)
        json_str = json.dumps(self.request.data)
        data = json.loads(json_str)
        try:
            invited = list(data['toInvite'])
            for i in invited:
                for j in User.objects.filter(username=i):
                    invite = EventInvite(invited=j, sender=request.user, event=self.get_object())
                    invite.save()
                    self.get_object().invited.add()
        except KeyError:
            pass
        return super(EventMixin, self).partial_update(request, *args, **kwargs)

    def create(self, request, *args, **kwargs):
        new = {}
        new['owner'] = request.user.__dict__
        new['date'] = request.data['date']
        new['time'] = request.data['time']
        new['location'] = request.data['location']
        sname = request.data['eventtype']

        new['eventtype'] = EventType.objects.get(sname=sname).__dict__

        json_str = json.dumps(self.request.data)
        data = json.loads(json_str)

        serializer = EventMixinSerializer(data=new)
        with open('/tmp/log.txt', 'w+') as f:
            f.write(str(serializer.is_valid()))
            f.write(str(serializer.validated_data))
            f.close()
        serializer.is_valid();
        serializer.save()

        try:
            invited = list(data['toInvite'])
            for i in invited:
                for j in User.objects.filter(username=i):
                    invite = EventInvite(invited=j, sender=request.user, event=self.get_object())
                    invite.save()
                    self.get_object().invited.add()
        except KeyError:
            pass

序列化器:

class EventMixinSerializer(serializers.ModelSerializer):
    owner = UserSerializer(read_only=True)
    eventtype = EventTypeSerializer()
    attenders = FriendsListingField(read_only=True)
    invited = FriendsListingField(read_only=True)

    class Meta:
        model = Event
        fields = ('owner', 'eventtype', 'date', 'time', 'location', 'id', 'attenders', 'invited')

    def create(self, validated_data):
        owner = validated_data.pop('owner')
        owner = owner.instance
        eventtype = validated_data.pop('eventtype')
        eventtype = eventtype.instance
        event = Event.objects.create(owner=owner, eventtype=eventtype, **validated_data)
        event.save()
        return event

存在所有者字段时出错:

    False
{'owner': OrderedDict([('username', ['A user with that username already exists.'])])}

UserSerializer(read_only=True) 时的结果(几乎禁用它):

    True
    OrderedDict([('eventtype', OrderedDict([('lname', 'Swimming'), ('sname', 'SWM'), ('category', '1')])), ('date', datetime.date(2015, 12, 22)), ('$

(注意结果中的事件类型数据)

谢谢!

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:

    您需要从UserSerializer 中删除验证器。

    假设UserSerializerUser ModelSerializer,它将从Model 中提取User.username 上的唯一约束,您的验证将失败。

    要解决此问题,您需要通过覆盖UserSerializerusername 字段的验证器列表来删除UniqueValidator

    【讨论】:

      猜你喜欢
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 2012-11-30
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多