Эквивалент objects.latest () в App Engine - PullRequest
4 голосов
/ 17 сентября 2010

Каков наилучший способ получить последний вставленный объект с помощью AppEngine? Я знаю, что в Django это можно сделать, используя

MyObject.objects.latest()

в AppEngine Я бы хотел сделать это

class MyObject(db.Model):
  time = db.DateTimeProperty(auto_now_add=True)

# Return latest entry from MyObject.
MyObject.all().latest()

Есть идеи?

Ответы [ 2 ]

5 голосов
/ 17 сентября 2010

Лучше всего будет реализовать класс latest() прямо на MyObject и назвать его как

latest = MyObject.latest()

Все остальное потребует установки встроенного класса Query.

Обновление

Я думал, что увижу, как уродливо было бы реализовать эту функцию. Вот класс mixin, который вы можете использовать, если вы действительно хотите звонить MyObject.all().latest():

class LatestMixin(object):
    """A mixin for db.Model objects that will add a `latest` method to the
    `Query` object returned by cls.all(). Requires that the ORDER_FIELD
    contain the name of the field by which to order the query to determine the
    latest object."""

    # What field do we order by?
    ORDER_FIELD = None

    @classmethod
    def all(cls):
        # Get the real query
        q = super(LatestMixin, cls).all()
        # Define our custom latest method
        def latest():
            if cls.ORDER_FIELD is None:
                raise ValueError('ORDER_FIELD must be defined')
            return q.order('-' + cls.ORDER_FIELD).get()
        # Attach it to the query
        q.latest = latest
        return q

# How to use it
class Foo(LatestMixin, db.Model):
    ORDER_FIELD = 'timestamp'
    timestamp = db.DateTimeProperty(auto_now_add=True)

latest = Foo.all().latest()
3 голосов
/ 17 сентября 2010

MyObject.all () возвращает экземпляр класса Query

Упорядочить результаты по времени:

MyObject.all().order('-time')

Итак, если есть хотя бы одна запись, вы можете получить самый последний MyObject напрямую:

MyObject.all().order('-time')[0]

или

MyObject.all().order('-time').fetch(limit=1)[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...