首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django中的对象显示为数字/ids。

django中的对象显示为数字/ids。
EN

Stack Overflow用户
提问于 2021-12-05 13:42:36
回答 1查看 94关注 0票数 0

更新:

最初的JSON输出如下:

代码语言:javascript
运行
复制
{ "id": 8
 "user": "k"
 "name": "new"
 "born": "2021-12-06"
 "body_colour": [ 2 ]
 "eye_colour": [ 2 ]
 "image": [ 1 ] }

我将RatSeralizer改为:

代码语言:javascript
运行
复制
class RatSerializer(FlexFieldsModelSerializer):
    user         = serializers.CharField(source='user.username')
    body_colour  = BodyColourSerializer(many=True)
    eye_colour   = EyeColourSerializer(many=True)
    class Meta:
        model = rat 
        exclude = ['bio']

它将JSON输出更改为如下所示,这正是我想要的:

代码语言:javascript
运行
复制
{
        "id": 8,
        "user": "k",
        "body_colour": [
            {
                "name": "Fawn"
            }
        ],
        "eye_colour": [
            {
                "name": "Black"
            }
        ],
        "image": [
            {
                "name": "lineart",
                "image": {
                    "small_square_crop": "http://localhost:8000/media/__sized__/images/lineart-crop-c0-5__0-5-50x50.PNG",
                    "thumbnail": "http://localhost:8000/media/__sized__/images/lineart-thumbnail-100x100.PNG",
                    "medium_square_crop": "http://localhost:8000/media/__sized__/images/lineart-crop-c0-5__0-5-400x400.PNG",
                    "full_size": "http://localhost:8000/media/images/lineart.PNG"
                }
            }
        ],
        "name": "new",
        "born": "2021-12-06"
    }

这正是我想要的,而不是数字,它显示的是完整的数据(所以在第一个JSON中,它是"body_colour": [ 2 ],现在它显示了体色的名称。上面写着"body_colour": [ { "name": "Fawn" } ]。但是,当我试图调用它时,我会得到这样的错误:

代码语言:javascript
运行
复制
Error: Objects are not valid as a React child (found: object with keys {name}). If you meant to render a collection of children, use an array instead.

  27 | 
  28 | componentDidMount() {
  29 |   RatStuff.getRats().then((res) => {
> 30 |     this.setState({ rats: res.data });
     | ^  31 |   });
  32 | }

因此,似乎它目前并不是作为一个数组被读取。

原始帖子:我使用的是React前端和Django后端的。我设法使它的用户可以添加老鼠到他们的帐户,然而,当我想获取有关老鼠的详细信息,详细信息被显示为数字,我假设详细信息的id?

下面是一个例子。当你看到其中一只老鼠的时候,你会得到这样的结果:

代码语言:javascript
运行
复制
User: 12, Rat Name: newrat Rat Body colour: 3, Eye colour: 3

所以正如你所看到的,你得到了id (?)除了老鼠的名字。它属于用户,其id为12,并创建了第3体颜色等。

这是我的模特:

代码语言:javascript
运行
复制
class EyeColour(models.Model):
    name = models.CharField(max_length=255)
    
    def __str__(self):
        return self.name
    
class BodyColour(models.Model):
    name = models.CharField(max_length=255)
    
    def __str__(self):
        return self.name

class rat(models.Model):
    name = models.CharField(max_length=132, null =True)
    body_colour = models.ManyToManyField(BodyColour, related_name='bodycolour')
    eye_colour = models.ManyToManyField(EyeColour, related_name='eyecolour')
    user = models.ForeignKey(User, on_delete=models.CASCADE, null = True)
    def __str__(self):
        return self.name

序列化程序:

代码语言:javascript
运行
复制
class EyeColourSerializer(FlexFieldsModelSerializer):
    class Meta:
        model = EyeColour
        fields = '__all__' 
        
class BodyColourSerializer(FlexFieldsModelSerializer):
    class Meta:
        model = BodyColour
        fields = '__all__' 

class RatSerializer(FlexFieldsModelSerializer):
    class Meta:
        model = rat
        # fields = '__all__' 
        exclude = ['bio']
        # read_only_fields = ['eye_colour', 'body_cdolour']
        expandable_fields = {
            'EyeColour': ('accounts.EyeColourSerializer', {'many': False}),
            'Image': ('accounts.ImageSerializer', {'many': False}),
        }

和意见:

代码语言:javascript
运行
复制
class ratViewset(FlexFieldsMixin, ReadOnlyModelViewSet):

    serializer_class = RatSerializer
    queryset = rat.objects.all()

最后,这是viewRats.jsx文件的一部分,您可以访问这个文件来查看每个鼠:

代码语言:javascript
运行
复制
class viewRat extends Component {
  constructor(props) {
    super(props);

    this.state = {
      id: this.props.match.params.id,
      rat: {},
    };
  }

  componentDidMount() {
    RatStuff.getRatById(this.state.id).then((res) => {
      this.setState({ rat: res.data });
    });
  }

....

<div className="row">
              <label> User: </label>
              <div> {this.state.rat.user}</div>
            </div>
            <div className="row">
              <label> Rat Name: </label>
              <div> {this.state.rat.name}</div>
            </div>
            <div className="row">
              <label> Rat Body colour: </label>
              <div> {this.state.rat.body_colour}</div>
            </div>
            <div className="row">
              <label> Eye colour: </label>
              <div> {this.state.rat.eye_colour}</div>
            </div>

我对这东西很陌生。我在做什么,这使它显示为数字/每个事物的id?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-05 15:20:55

在序列化程序中,为用户添加一个带有source属性的序列化程序字段。对于许多字段,您必须设置many=True,这将返回所有相关序列化对象的列表

代码语言:javascript
运行
复制
class EyeColourSerializer(FlexFieldsModelSerializer):
    class Meta:
        model = EyeColour
        fields = '__all__' 
    
class BodyColourSerializer(FlexFieldsModelSerializer):
    class Meta:
        model = BodyColour
        fields = '__all__' 

class RatSerializer(FlexFieldsModelSerializer):
    user         = serializers.CharField(source='user.username')
    body_colour  = BodyColourSerializer(many=True)
    eye_colour   = EyeColourSerializer(many=True)
    class Meta:
        model = rat
        # fields = '__all__' 
        exclude = ['bio']
        # read_only_fields = ['eye_colour', 'body_cdolour']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70234898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档