python - 如何获得带有子相关项目子查询的 Django-Rest 框架?

标签 python django django-rest-framework

我有一个看起来有点像这样的模型:

数据集

class Dataset(ClusterableModel):


    group = models.ForeignKey(DataGroup, on_delete=models.CASCADE, related_name='datasets')

    is_public = models.BooleanField(default=False)

    title = models.CharField(max_length=255)
    name = models.CharField(max_length=255, unique=True)

数据组

class DataGroup(models.Model):
    name = models.CharField(max_length=255, unique=True)

我在 DRF 中得到了一些东西,看起来像这样:

class DataGroupSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='datagroup-detail')
    datasets = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='dataset-detail', lookup_field='name')

    class Meta:
        model = DataGroup
        fields = ['id', 'name', 'url', 'datasets']


class DataGroupViewSet(viewsets.ModelViewSet):
    queryset = DataGroup.objects.all()
    serializer_class = DataGroupSerializer

但是,我的问题是应该为用户过滤数据集。

现在,有了数据集,他们就得到了这样的子集:

def get_queryset(self):
    return self.queryset.for_user(self.request.user)

但是,我的问题是如何使用上面的 DataGroupSerializer 做什么?

编辑:我尝试了下面建议的方法,在这里:

class DatasetInDataGroupField(serializers.HyperlinkedRelatedField):
    def get_queryset(self):
        user = self.context['request'].user
        queryset = Dataset.objects.for_user(user)
        print(list(queryset))
        return queryset


class DataGroupSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='datagroup-detail')
    datasets = DatasetInDataGroupField(many=True, view_name='dataset-detail', lookup_field='name')

    class Meta:
        model = DataGroup
        fields = ['id', 'name', 'url', 'datasets']

我只得到具有打印权限的数据集,但它们都出现在数据集列表中......所以尝试其他方法。

最佳答案

我最后是这样解决的。效果很好。

class DatasetInGroupSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='dataset-detail', lookup_field='name')

    class Meta:
        model = Dataset
        lookup_field = 'name'
        fields = [
            'name', 'url']


class DataGroupSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='datagroup-detail')

    datasets = serializers.SerializerMethodField()

    class Meta:
        model = DataGroup
        fields = ['id', 'name', 'url', 'datasets']

    def get_datasets(self, obj):
        queryset = obj.datasets.all()
        if 'request' in self.context:
            queryset = queryset.for_user(self.context['request'].user)
        serializer = DatasetInGroupSerializer(queryset, many=True, context=self.context)
        return serializer.data


class DataGroupViewSet(viewsets.ModelViewSet):
    queryset = DataGroup.objects.all()
    serializer_class = DataGroupSerializer

关于python - 如何获得带有子相关项目子查询的 Django-Rest 框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38218996/

相关文章:

Django 递归关系

python - Django 可重用应用程序,具有与friendfeed 类似的功能

python - Django 。如何在子模型中存储来自 mixin 的父模型字段?

python - 如何使用Django访问网页数据?

python - Xlsxwriter Excel 图表边框

python - gekko 的 MIP 问题 - 它不会收敛到解决方案,也不返回错误

python - 如何通过 Python 脚本多次运行具有不同输入的同一程序?

django-rest-framework:序列化器数据的 "id"字段返回 null

python - 为什么这个简单的两行 python 网页抓取代码在 python 解释器中可以正确执行,但在我的 PC 上却不能?

python - Django REST - 使用序列化器创建带有外键的对象