Как получить последний обновленный продукт в работе Django Restframe? - PullRequest
0 голосов
/ 04 мая 2018

Здесь я упомянул мою модель, сериализатор и вид. На самом деле я новичок в этой концепции. Я не знаю, как получить последний добавленный товар.

Models.py

class Products(models.Model):
    name = models.CharField(max_length=100)
    image = models.CharField(max_length=100, null=True)
    categories =  models.ArrayModelField(
        model_container=Category,
        model_form_class=CategoryForm
    )
    specifications =  models.ArrayModelField(
        model_container=Specifications,
        model_form_class=SpecificationsForm
    )
    description = models.CharField(max_length=1000)
    reviews =  models.ArrayModelField(
        model_container=Reviews,
        model_form_class=ReviewsForm
    )
    drizzly = models.BooleanField(default=False)
    complete = models.BooleanField(default=False)
    comment = models.CharField(max_length=500)
    click_count = models.IntegerField()

serializer.py

class ProductsSerializer(serializers.ModelSerializer):
  class Meta:
    model = Products
    fields = ('id',
              'name',
              'image',
              'categories',
              'specifications',
              'description',
              'reviews',
              'drizzly',
              'complete',
              'comment',
              'click_count')

views.py

class ProductsViewSet(viewsets.ModelViewSet):
   """
   API endpoint that allows groups to be viewed or edited.
   """
   queryset = Products.objects.all()
   serializer_class = ProductsSerializer

Скажите, пожалуйста, как это сделать?

Ответы [ 5 ]

0 голосов
/ 07 мая 2018

Работа с фильтрацией объектов по моменту их добавления в базу данных с использованием поля времени данных для отслеживания обновленного времени обеспечит меньший способ удаления ошибок для получения последних объектов.

Смотрите также: Получение самого последнего объекта , Заказ объектов модели

models.py

class Products(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    name = models.CharField(max_length=100)
    image = models.CharField(max_length=100, null=True)
    categories =  models.ArrayModelField(
        model_container=Category,
        model_form_class=CategoryForm
    )
    specifications =  models.ArrayModelField(
        model_container=Specifications,
        model_form_class=SpecificationsForm
    )
    description = models.CharField(max_length=1000)
    reviews =  models.ArrayModelField(
        model_container=Reviews,
        model_form_class=ReviewsForm
    )
    drizzly = models.BooleanField(default=False)
    complete = models.BooleanField(default=False)
    comment = models.CharField(max_length=500)
    click_count = models.IntegerField()

    class Meta:
        # Latest by ascending updated_at.
        get_latest_by = "updated_at"
        # This will ensure the objects returned are ordered latest to earliest. 
        ordering = ['-updated_at']

serializer.py

class ProductsSerializer(serializers.ModelSerializer):
  class Meta:
    model = Products
    exclude = ['created_at', 'updated_at']

views.py

class ProductsViewSet(viewsets.ModelViewSet):
   """
   API endpoint that allows groups to be viewed or edited.
   """
   # Using Products.objects.latest() should return the latest using 
   # the updated_at DateTimeField. 
   # Note this will raise `Models.DoesNotExist` if there is no object.
   # Using the Model._meta.ordering the queryset should be ordered by
   # the `latest` first or you can also use 
   # `Model.objects.order_by('-updated_at')`
   queryset = Products.objects.all()
   serializer_class = ProductsSerializer
0 голосов
/ 04 мая 2018

Попробуйте

from {app_name} import Products
Products.objects.reverse()[0]

Поскольку в каждой созданной модели есть первичный ключ pk по умолчанию, вы можете выполнить специальную фильтрацию, используя

Products.objects.filter(order_by='pk')
0 голосов
/ 04 мая 2018

Так как последний продукт имеет самый высокий id, вы можете попробовать вот так

last_product = Products.objects.order_by('-id')[0]

То, что я здесь делаю, упорядочивает весь проект в обратном порядке по id , затем получаем первый элемент из этого.

0 голосов
/ 04 мая 2018

Вам необходимо поле "last_modified" временной метки в вашей модели, очевидно, иначе вы не сможете узнать, когда была обновлена ​​запись:

import time

class Products(models.Model):
   # your existing fields here
   last_updated = models.FloatField(
      "last_updated", 
       editable=False, 
       default=time.time
       )

   def save(self, *args, **kw):
       self.last_updated = time.time()           
       if "update_fields" in kw:
           kw["update_fields"].append("last_updated")
       super(Product, self).save(*args, **kw)

и, конечно, генерировать и передавать миграцию.

Затем вы можете получить последнюю обновленную запись, используя QuerySet.latest(*fields):

last_updated_product = Product.objects.latest("last_modified")

Я не использую DRF, поэтому не могу сказать, как подключить это к вашему ProductsViewSet, но определенно есть некоторая доступная документация ...

0 голосов
/ 04 мая 2018

Самый простой способ получить последний продукт:

 Products.objects.last()

С помощью функции reverse () вы можете сделать: Products.objects.all().reverse()[0]

Для первого: Products.objects.first()

Это то, что вы хотите?

...