python - 如何更改 Django Rest Framework 中多对多相关对象的表示

标签 python django django-rest-framework

我想要 GET 上的完整相关模型,并在 CREATE、UPDATE 和 DELETE 上使用 id。 我尝试使用 to_representation。 所以我想创建一个名为 users 的字典数组,它应该显示完整的用户。

但是当我在对象中添加字典时,我收到错误“unhashable type: 'ReturnDict'”,如果我通过直接写入数组来为单个用户执行此操作,则效果很好。

class CompanySerializer(serializers.ModelSerializer):
    #users = UserSerializer(many=True)
    created_at = serializers.DateTimeField()
    updated_at = serializers.DateTimeField()
    class Meta:
        model = Company
        fields = ['id', 'name', 'street', 'city', 'postal_code', 'state', 'company_form', 'users', 'created_at', 'updated_at']        

    def to_representation(self, instance):
        representation = super(CompanySerializer, self).to_representation(instance)
        representation['company_form'] = CompanyFormSerializer(instance.company_form).data
        representation['users'] = []
        for entry in instance.users.all():
            user = {UserSerializer(entry).data}
            representation['users'].extend(user)
        return representation

最佳答案

无需手动执行此操作,您可以将序列化器添加到序列化器中,例如:

class CompanySerializer(serializers.ModelSerializer):
    <b>users = UserSerializer(read_only=True, many=True)
    company_form = CompanyFormSerializer()</b>
    created_at = serializers.DateTimeField()
    updated_at = serializers.DateTimeField()

    class Meta:
        model = Company
        fields = ['id', 'name', 'street', 'city', 'postal_code', 'state', 'company_form', 'users', 'created_at', 'updated_at']

有关详细信息,请参阅Dealing with nested objects section of the Django REST Framework documentation .

您的 to_representation 模型有两个部分错误:

  1. 您将 .data 的结果包装在一个集合中,但正如您发现的那样,字典不能放入字典中,因为集合是可变的;和
  2. 您应该在此处使用 .append(..) 而不是 .extend(..)
def to_representation(self, instance):
    representation = super(CompanySerializer, self).to_representation(instance)
    representation['company_form'] = CompanyFormSerializer(instance.company_form).data
    representation['users'] = []
    for entry in instance.users.all():
        user = <b>UserSerializer(entry).data</b>
        representation['users']<b>.append(</b>user<b>)</b>
    return representation

但是话虽这么说,在我看来,旨在自己做到这一点的软件设计是糟糕的。 Django 有很多工具可以通过 URI 等正确处理关系。

关于python - 如何更改 Django Rest Framework 中多对多相关对象的表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57458468/

相关文章:

ReactJS 和 DRF : How to store JWT token inside HTTPonly cookies?

python - Django 休息框架 : how do I Display content of Foreign keys in JSON

django rest extensions drf-extensions TypeError at/data/register() 得到了一个意外的关键字参数 'parents_query_lookups'

python - 如何使用 LaTeX 括号在 Matplotlib 中标记轴?

python - Django 项目中应用程序范围的 utils 文件的位置

python - 客户端不支持服务器请求的认证协议(protocol)考虑升级mysql客户端

django - 只允许 super 用户登录

python - _curses.error : addwstr() returned ERR on changing nlines to 1 on newwin method

python - 如何处理来自 urllib.request.urlopen() 的响应编码,以避免 TypeError : can't use a string pattern on a bytes-like object

python - 使用 Django REST Framework ViewSets 表示多个对象/列表 CRUD 操作