Django Rest Framework 将查询集发送到序列化程序尝试 SlugRelatedField
Django Rest Framework send queryset to serializer try SlugRelatedField
您好,我正在尝试将有序查询发送到我的父序列化程序尝试 slug 相关字段,但我收到“供应商类型的对象不是 JSON 可序列化的”。我也试过做一个“serializers.SerializerMethodField()”但是我得到了同样的错误。有没有办法做类似的事情?在我的模型中,我按名称对其进行排序,因此我需要执行另一个查询,以便我可以按上次访问的顺序对其进行排序。我应该制作新的模型 serialzier 并在那里进行查询并将其传递给父序列化器吗?
models.py
last_visited = models.DateTimeField(auto_now_add=True, null=True)
class Meta:
ordering = ["name"]
@property
def last_4_visited(self):
return Supplier.objects.order_by('last_visited')[3]
serializer.py
suppliers = serializers.SlugRelatedField(slug_field='last_4_visited', many=True, read_only=True)
- 在您的 属性 中硬编码访问次数并不是一个好方法,即为抽象
n
创建方法,然后在您的 属性. 中使用
...
@classmethod
def last_n_visited(cls, n: int):
return cls.objects.order_by('last_visited')[:n-1]
@property
def last_4_visited(self):
return type(self).last_n_visited(4)
- 回答你的问题。
class SupplierSerializer(serializers.ModelSerializer):
class Meta:
model = Supplier
fields = "__all__"
# and then in your other serializer or even in this one:
class SomeSerilializer(...):
last_4_visited = serializers.SerializerMethodField(method_name="get_last_4_visited")
def get_last_4_visited(self, obj):
suppliers = Supplier.last_n_visited(4)
return SupplierSerializer(suppliers, many=True).data
您好,我正在尝试将有序查询发送到我的父序列化程序尝试 slug 相关字段,但我收到“供应商类型的对象不是 JSON 可序列化的”。我也试过做一个“serializers.SerializerMethodField()”但是我得到了同样的错误。有没有办法做类似的事情?在我的模型中,我按名称对其进行排序,因此我需要执行另一个查询,以便我可以按上次访问的顺序对其进行排序。我应该制作新的模型 serialzier 并在那里进行查询并将其传递给父序列化器吗?
models.py
last_visited = models.DateTimeField(auto_now_add=True, null=True)
class Meta:
ordering = ["name"]
@property
def last_4_visited(self):
return Supplier.objects.order_by('last_visited')[3]
serializer.py
suppliers = serializers.SlugRelatedField(slug_field='last_4_visited', many=True, read_only=True)
- 在您的 属性 中硬编码访问次数并不是一个好方法,即为抽象
n
创建方法,然后在您的 属性. 中使用
...
@classmethod
def last_n_visited(cls, n: int):
return cls.objects.order_by('last_visited')[:n-1]
@property
def last_4_visited(self):
return type(self).last_n_visited(4)
- 回答你的问题。
class SupplierSerializer(serializers.ModelSerializer):
class Meta:
model = Supplier
fields = "__all__"
# and then in your other serializer or even in this one:
class SomeSerilializer(...):
last_4_visited = serializers.SerializerMethodField(method_name="get_last_4_visited")
def get_last_4_visited(self, obj):
suppliers = Supplier.last_n_visited(4)
return SupplierSerializer(suppliers, many=True).data