python - 在 Django Rest Framework 中列出某些内容时,如何不仅仅显示对象的外键?
问题描述
我正在研究一个名为 Tour 的类中的一个问题,其中包括一个 Artist 外键。我需要展示的不仅仅是它的外键。如何在保持所有 CRUD 功能的同时做到这一点?
我试图将 depth = 1 添加到序列化程序中的 Meta 类中。这可行,但是在尝试创建新对象时,我收到错误 NOT_NULL CONSTRAINT FAILED。然后我摆脱了它,而是将艺术家 = ArtistSerializer 添加到 TourSerializer 中,但这仍然没有做到,即使我已经在教程中看到它工作。使用 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']
Tour 和 Artist 的模型如下:
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_represent()
方法。例如:
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
这样,当您创建/更新Tour
实例时,您可以传递 FK 值,但在读取时,您将从Artist
对象中获取所有字段。
推荐阅读
- mapbox - Mapbox Studio:土地使用=住宅不可用?
- swift - Scrollview without NavigationController
- javascript - 无法运行 docker 镜像,Docker 正在寻找不同的扩展
- javascript - 在单独的字段中隔离提取请求的正确方法是什么
- c++ - sscanf() 带有两个字符串参数
- c# - 为什么 EF Core 在创建 SELECT 子句导致异常时生成错误的导航字段名称?
- c# - 将 lambda 存储在 C# 中的变量中
- r - 计算并返回 R 中矩阵 A 和 B 之间的单个距离值
- python - 将 pandas 系列的 collections.counter 对象转换为多列 pandas 数据框
- php - Google OAuth“错误 403:org_internal”,允许用户选择另一个登录