Django REST框架使用CREATE()可写的嵌套字段



我正在尝试编写一种创建方法,该方法将写下我的嵌套字段,但发现嵌套对象未写入。

这是我正在使用的样本:

class UserSerializer(serializers.ModelSerializer):
    profile = ProfileSerializer()
    class Meta:
        model = User
        fields = ('username', 'email', 'profile')
    def create(self, validated_data):
        profile_data = validated_data.pop('profile')
        user = User.objects.create(**validated_data)
        Profile.objects.create(user=user, **profile_data)
        return user

,但我无法理解用户=用户所指的内容。

这是我的代码:

class MessagesSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.IntegerField(source='pk', read_only=True)
    suggested_songs = SongSerializer()
    class Meta:
        model = Messages
        fields = ('id','owner','url','suggested_songs',)
        #fields = ('id','url','suggested_songs',)
    def create(self, validated_data):
        song_data = validated_data.pop('suggested_songs')
        message = Messages.objects.create(**validated_data)
        Song.objects.create(**song_data)
        return message
class SongSerializer(serializers.HyperlinkedModelSerializer):
    #id = serializers.IntegerField(source='pk', read_only=True)
    class Meta:
        model = Song
        fields =     ('id','title','artist','album','albumId','num_votes','cleared')
    read_only_fields = ('song_id')

class Messages(models.Model):
    owner = models.OneToOneField(User, primary_key=True,     related_name='user_messages', editable=False) #TODO, change owner to 'To'
    #suggested_songs = models.ManyToManyField(Song, related_name='suggested_songs')
    suggested_songs = models.ForeignKey(Song, null=True, blank=True)

    # If a user is added, this runs. 
    @receiver(post_save, sender=User)
    def create_friend_for_user(sender, instance=None, created=False, **kwargs):
        if created:
            Messages.objects.get_or_create(owner=instance)
    # Same as above, but for deletion 
    @receiver(pre_delete, sender=User)
    def delete_friend_for_user(sender, instance=None, **kwargs):
        if instance:
           Messages.objects.get(owner=instance).delete()
class Song(models.Model):
    """
    A model which holds information about the songs.
    """
    #song_id = models.IntegerField(primary_key=True)
    title = models.CharField(max_length=150, blank=True, default='')
    artist = models.CharField(max_length=150, blank=True, default='')
    album = models.CharField(max_length=150, blank=True, default='')
    albumId = models.CharField(max_length=150, blank=True, default='')
    num_votes = models.IntegerField(default=0, blank=True)
    cleared = models.BooleanField(default=False, blank=True)
    class Meta:
        ordering = ('title',)
        #managed=True

我认为问题可能在MessageSerializer.create方法中:

def create(self, validated_data):
        # here you are popping the suggested songs
        song_data = validated_data.pop('suggested_songs')
        # so when you create the message here the foreign key is set to NULL
        message = Messages.objects.create(**validated_data)
        # and here you create the Song instance correctly but it is not
        # associated with the message
        Song.objects.create(**song_data)
    return message

您需要像在示例中一样将外键传递给Messages.create方法。

def create(self, validated_data):
        song_data = validated_data.pop('suggested_songs')
        song = Song.objects.create(**song_data)
        # song need to be created first because the foreign key is in
        # the Messages model
        message = Messages.objects.create(suggested_songs=song, **validated_data)
        return message

我希望这会有所帮助!

最新更新