Joh*_*aff 7 python django django-rest-framework
我有这个代码
# Models
class NestedSample(models.Model):
something = models.CharField(max_length=255)
class Sample(models.Model):
thing = models.BooleanField()
nested = models.ForeignKey(NestedSample)
# Serializers
class NestedSampleSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = api_models.NestedSample
class SampleSerializer(serializers.HyperlinkedModelSerializer):
nested = NestedSampleSerializer() # HERE filter delete=false
nested2 = NestedSample2Serializer() # HERE filter deletefalse
class Meta:
model = api_models.Sample
Run Code Online (Sandbox Code Playgroud)
在我看来,我正在覆盖查询集,delete=False但它不适用于嵌套的序列化程序.
Anu*_*dra 12
delete=False在queryset中只会过滤Sample.要在嵌套的序列化程序中过滤查询集,您可以使用serializers.ListSerializer:
class FilterDeleteListSerializer(serializers.ListSerializer):
def to_representation(self, data):
data = data.filter(delete=False)
return super(FilterDeleteListSerializer, self).to_representation(data)
class NestedSampleSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = api_models.NestedSample
list_serializer_class = FilterDeleteListSerializer
class NestedSample2Serializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = api_models.NestedSample2
list_serializer_class = FilterDeleteListSerializer
class SampleSerializer(serializers.HyperlinkedModelSerializer):
nested = NestedSampleSerializer() # HERE filter delete=false
nested2 = NestedSample2Serializer() # HERE filter deletefalse
class Meta:
model = api_models.Sample
Run Code Online (Sandbox Code Playgroud)
在这里了解更多
我并没有完全理解你的问题,但是根据我的想法,你在模型中有一个布尔字段,如果删除对象而不是实际从数据库中删除它,则设置为True(SQL DELETE).
现在回答您的问题,如果您只想过滤嵌套的序列化程序,那么您可以使用SerializerMethodField.您需要指定要作为参数调用的方法,或者添加名为"get_"的方法,后跟字段名称.在此方法中,您可以过滤查询集序列化它并返回该查询集的数据.
class UserSerializer(serializers.ModelSerializer):
delete_filtered_items = serializers.SerializerMethodField()
class Meta:
model = User
def get_delete_filtered_items(self, obj):
items = Item.objects.filter(user=obj,deleted=False)
serializer = ItemsSerializer(instance=items, many=True)
return serializer.data
Run Code Online (Sandbox Code Playgroud)
上述解决方案应该适合您的要求,但是如果您实现的类似于软删除,那么创建自定义模型管理器似乎更简洁,更模块化.
| 归档时间: |
|
| 查看次数: |
2637 次 |
| 最近记录: |