Сделать количество рядов после сужения

Это мой сериализатор.

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.

Вернуться на верх