Сделать количество рядов после сужения
Это мой сериализатор.
class MixSerializer(serializers.ModelSerializer):
pub_date = serializers.DateTimeField(format="%m/%d/%Y,%I:%M:%S %p")
new_order = #I want to get the number order
class Meta:
model = Mix
fields = ('id','pub_date','detail','user','u_key')
И я сужаю ряды, как показано ниже.
def get_queryset(self):
queryset = Mix.objects.all()
u_key = self.request.query_params.get('u_key')
if u_key is not None:
queryset = queryset.filter(u_key=u_key)
return queryset
Например, он возвращает 30 элементов из 100 элементов.
поэтому id
должно быть (1,4,5,6,9,11,13...)
вот так,
Однако я хочу получить число new_order
(1,2,3,4,5,6,....)
Наверное, я должен сделать какой-то трюк в Serializer
?
или любым другим способом
Любая помощь приветствуется.
Ну ID - это фактический ID в базе данных, который вы не хотите изменять или переопределять в вашем наборе запросов (или где-либо еще, например, в шаблоне), потому что тогда вы будете ссылаться на другой объект модели, что вызовет проблемы.
Если вы хотите использовать ID в качестве некоторого вида рейтинга, то у вас есть несколько вариантов, ссылаясь на мой ответ здесь
Самый простой способ - использовать forloop.counter в шаблоне или enumerate в представлении:
# template
{% for object in objects %}
# rank is {{ forloop0.counter }}
{% endfor %}
# views
for index, value in enumerate(queryset):
# order is the index variable
...
Если вы хотите явно добавить ранг в кверисет, то вы можете использовать аннотацию:
from django.db.models import Window, F
from django.db.models.functions import DenseRank
queryset = Mix.objects.annotate(
ranking=Window(
expression=DenseRank(),
order_by=[
F('id').desc(),
]))
Если вы хотите получить данные таблицы заказов, вы должны создать Order Serializer и связать его с этим MixSerilizer, Как это,
class OrderSerializer(serializers.ModelSerializer):
class Meta:
model = Order
fields = ('id',)
class MixSerializer(serializers.ModelSerializer):
pub_date = serializers.DateTimeField(format="%m/%d/%Y,%I:%M:%S %p")
new_order = OrderSerializer()
class Meta:
model = Mix
fields = ('id','pub_date','detail','user','u_key','new_order')
models.py
class Mix(models.Model):
----
----
order = models.ForeignKey(Order, related_name=new_order, on_delete=models.CASCADE)
Если вы хотите получить данные родительской таблицы в дочернюю таблицу, вы должны передать атрибут "related_name" в поля модели. а также это имя в дочернюю таблицу sterilizer.