Python 在Django Rest框架中列出某些内容时,如何显示对象的外键?

Python 在Django Rest框架中列出某些内容时,如何显示对象的外键?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我在一个叫做Tour的课程中研究一个问题,其中包括一个艺术家的外键。我需要显示的不仅仅是它的外键。如何在保持所有CRUD功能正常的情况下做到这一点 我尝试将depth=1添加到序列化程序中的元类中。这是可行的,但在尝试创建一个新对象时,我发现错误NOT_NULL约束失败。然后我去掉了它,而是在TourSerializer中添加了artist=ArtistSerializer,但这仍然不行,尽管我在教程中看到了它的工作原理。使用artist=ArtistSerializer的问题是,当我尝试创建对

我在一个叫做Tour的课程中研究一个问题,其中包括一个艺术家的外键。我需要显示的不仅仅是它的外键。如何在保持所有CRUD功能正常的情况下做到这一点

我尝试将depth=1添加到序列化程序中的元类中。这是可行的,但在尝试创建一个新对象时,我发现错误NOT_NULL约束失败。然后我去掉了它,而是在TourSerializer中添加了artist=ArtistSerializer,但这仍然不行,尽管我在教程中看到了它的工作原理。使用artist=ArtistSerializer的问题是,当我尝试创建对象时,我传递了外键,但它似乎无法将其识别为有效字段。好像我根本没有在字段中输入任何内容。每次我让它正确地列出它时,创建并没有按预期工作。下面是我的代码现在的样子:

class TourSerializer(ModelSerializer):
artist = ArtistSerializer()

class Meta:
    model = Tour
    fields = ['artist', 'start', 'end', 'country', 'id', 'created_at', 'updated_at']
    read_only_fields = ['id', 'created_at', 'updated_at']
巡回演出和艺术家的模型如下:

class Tour(models.Model):
artist = models.ForeignKey('core.Artist', on_delete=models.PROTECT)
start = models.DateField(auto_now=False, auto_now_add=False)
end = models.DateField(auto_now=False, auto_now_add=False)
country = models.CharField(max_length=70)
created_at = models.DateField(auto_now_add=True)
updated_at = models.DateField(auto_now=True)


class Artist(models.Model):
user = models.ForeignKey('core.User', on_delete=models.PROTECT)
name_alternative = models.CharField(max_length=50)
country = models.CharField(max_length=50)
bio = models.TextField(max_length=2500)
profile_image = models.ImageField(upload_to='user/profile', null=True, blank=True)
tags = models.ManyToManyField('core.Tag', blank=True)
labels = models.ManyToManyField('core.Label', blank=True)
created_at = models.DateField(auto_now_add=True)
updated_at = models.DateField(auto_now=True)
为了更好的衡量,这里是艺术家系列:

class ArtistSerializer(ModelSerializer):
user = serializers.HiddenField(
    default=serializers.CurrentUserDefault()
)

class Meta:
    model = Artist
    fields = ['id', 'user', 'name_alternative', 'labels', 'tags',
              'country', 'bio', 'profile_image', 'created_at', 'updated_at']
    read_only_fields = ['id', 'created_at', 'updated_at', 'user']

这是我在这里的第一个问题,如果我遗漏了任何重要的代码,请告诉我。

也许您可以更新TourSerializer的to_represente方法。例如:

class TourSerializer(ModelSerializer):
    class Meta:
        model = Tour
        fields = ['artist', 'start', 'end', 'country', 'id', 'created_at', 'updated_at']
        read_only_fields = ['id', 'created_at', 'updated_at']

    def to_representation(self, instance):
        response = super().to_representation(instance)
        response['artist'] = ArtistSerializer(instance.artist).data
        return response
这样,在创建/更新巡更实例时,可以传递FK值,但在读取时,将从Artister对象获取所有字段