簡體   English   中英

在Django Rest Framework中列出某些內容時,如何不僅顯示對象的外鍵?

[英]How can you show more than just the foreign key of an object when listing something in Django Rest Framework?

我正在一個名為Tour的課程中研究一個問題,其中包括Artist外鍵。 我需要展示的不僅僅是它的外鍵。 在保持所有CRUD功能正常的情況下,我該怎么做?

我試圖在序列化器中將depth = 1添加到Meta類。 可以,但是在嘗試創建新對象時,出現錯誤NOT_NULL CONSTRAINT FAILED。 然后我擺脫了這個問題,而是將artist = 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']

這是我的第一個問題,所以讓我知道是否錯過任何重要的代碼。

可能您可以更新TourSerializerto_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對象中獲取所有字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM