我有一个看起来有点像这样的模型:
数据集
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/