在django rest框架中显示相关字段的不同字段

Tik*_*aba 2 django django-rest-framework

我有这个 Item 模型的序列化程序。

class Item(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=150)
    body = models.TextField(blank=True)
    image = models.ImageField(upload_to=get_upload_file_name, blank=True)

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('id', 'user', 'title', 'body', 'image')

    def create(self, validated_data):
        item = Item.objects.create(
            user=self.validated_data['user'],
            title=self.validated_data['title'],
            body=self.validated_data['body'],
            image=self.validated_data['item_image']
        )
        return item
Run Code Online (Sandbox Code Playgroud)

和用户序列化程序。

class CustomUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomUser
        fields = (
            'id', 'email', 'password', 'username', 'first_name', 'last_name',
        )
        extra_kwargs = {
            'password': {'write_only': True},
            'id': {'read_only': True}
        }

    def create(self, validated_data):
        user = CustomUser.objects.create(
            email=validated_data['email'],
            username=validated_data['email'],
            first_name=validated_data['first_name'],
            last_name=validated_data['last_name'],
        )
        user.set_password(validated_data['password'])
        user.save()
        return user
Run Code Online (Sandbox Code Playgroud)

但是在 ItemSerialzer 中,对于用户字段,我想显示用户的 id、first_name 和 last_name。我怎样才能做到这一点?如果这是一个菜鸟问题,我很抱歉,我只是一个初学者。谢谢你。

Asw*_*K P 5

您可以使用DRF 的source属性来遍历外键字段。

class ItemSerializer(serializers.ModelSerializer):
  user_id = serializers.CharField(source="user.id")
  first_name = serializers.CharField(source="user.first_name")
  last_name = serializers.CharField(source="user.last_name")

  class Meta:
    model = Item
    fields = ('id', 'user', 'title', 'body', 'image','user_id', 'first_name', 'last_name')   
Run Code Online (Sandbox Code Playgroud)