python - 如何在使用 ListViewSet 时对序列化器 MethodField 上的序列化器数据进行排序?
问题描述
我有一堂课说 GetStudentDetails 我正在使用一个序列化器,它的序列化器 MethodField 说 postal_address 并且我希望我的结果基于这个字段进行排序
我尝试添加 ordering = ('postal_address',) 并且由于它不是模型字段,因此遇到错误。
class GetStudentDetails(viewsets.GenericViewSet, mixins.ListModelMixin):
model = Student
queryset = Student.objects.all()
serializer_class = StudentCreateSerializer
filter_backends =
(filters.OrderingFilter,filters.DjangoFilterBackend,)
class StudentCreateSerializer(serializers.ModelSerializer):
postal_address = serializers.SerializerMethodField()
def get_postal_address(self, obj):
return Address.objects.get(name=obj.name).address
class Meta:
model = Vehicle
fields = ('name','city','state',postal_address')
class Address(models.Model):
name=models.ForeignKey(Student, on_delete=models.CASCADE)
address=models.CharField(max_length=60)
class Student(models.Model):
name=models.CharField(max_length=45)
city=models.CharField(max_length=10)
state=models.CharField(max_length=10)
def __str__(self):
return name
实际结果:
[{"name":test",
"city":"abc",
"state":"def",
"postal_address":"abcdef"
},
{
"name":"test2",
"city":"aa",
"state":"bb",
"postal_address":"aabb"
}]
预期结果:
[{
"name":"test2",
"city":"aa",
"state":"bb",
"postal_address":"aabb"
},
{"name":test",
"city":"abc",
"state":"def",
"postal_address":"abcdef"
}]
解决方案
我会尝试按您正在组合的 2 个字段排序:
ordering = ('city', 'state')
更新:
根据您更改的标准,尝试:
ordering = ('address_set__address', )
尽管根据这篇文章,这种方法存在问题,回答者通过将排序硬编码到相关模型中来解决。所以在你的情况下:
class Address(models.Model):
...
class Meta:
ordering = ('address',)
然后在您的其他模型/序列化器中:
ordering = ('address_set', )
推荐阅读
- java - Whitelabel 错误页面出现意外错误(类型=未找到,状态=404,每当我从 @requestMapping 控制器返回 HTML 页面时,
- r - R包插入符号无法加载
- javascript - 通过本地网络托管 HTTPS
- postgresql - 在 react native / expo 应用程序中使用 asyncStorage 或查询 hasura 数据库以获取持久的纬度/经度数据更好吗?
- c++ - C ++中递归期间的堆栈溢出
- kubernetes - 入口控制器未路由到根
- windows - 有没有办法在 Windows 10 中对文件进行密码保护?
- c - 怎么能做插入排序,但要打印从最高到最低的 GPA?
- sql-server - LocalDB 单独安装连接字符串
- python - AttributeError 对象没有“find_all”的属性