【问题标题】:Join more than 2 tables in Django在 Django 中加入超过 2 个表
【发布时间】:2019-02-18 01:05:10
【问题描述】:

我正在尝试创建一个新端点,它将返回 3 个表的连接结果(没有模型类)

我尝试加入的 3 个模型是:UserInstitutionSite,以便显示名称为他们所属的网站。

我已经定义了自己的序列化器如下:

  class DashboardSerializer(serializers.Serializer):
    id = serializers.CharField(read_only=True)
    email = serializers.CharField()
    first_name = serializers.CharField()
    last_name = serializers.CharField()
    full_address = serializers.CharField()
    country = serializers.CharField()
    status = serializers.CharField()
    role = serializers.CharField()
    date_joined = serializers.DateTimeField()
    institution_id = serializers.CharField()
    site_id = serializers.CharField()
    site_name = serializers.CharField()

    def create(self, validated_data):
        pass

    def update(self, instance, validated_data):
        pass

和视图集:

class DashboardViewSet(viewsets.ModelViewSet):

    queryset = User.objects.all().select_related('institution_id').select_related('site_id')
    serializer_class = DashboardSerializer

    @api_view(['GET'])
    def get(self, request):
        if request.method == 'GET':
            users = User.objects.all().select_related('institution_id').select_related('site_id')
            serializer = DashboardSerializer(users, many=True)
            return JsonResponse(serializer.data, safe=False)

问题是当我到达端点时:

select_related 中给出的字段名称无效:'institution_id', 'site_id'。选择是:机构

我不确定这是否是查询、序列化程序或两者都有问题。任何帮助将不胜感激。

【问题讨论】:

  • 这里可以使用注解。

标签: django django-rest-framework


【解决方案1】:

当您添加select_related 时,它依赖于字段名称,而不是数据库列名称。在您的模型中,您没有字段institution_id,而是institution

来源:https://docs.djangoproject.com/en/2.1/ref/models/querysets/#select-related

另外,据我所知,select_related 不能进行多个级别,但prefetch_related 可以。

试试:

User.objects.all().prefetch_related('institution_set, institution_set__site_set')

请在此处查看答案:https://stackoverflow.com/a/27117246/86698

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2014-09-17
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多