Частое обновление одного файла модели Django - PullRequest
0 голосов
/ 18 декабря 2011

Представьте, у меня есть News модели со многими текстовыми полями

class News(models.Model):

    title = models.CharField(max_length=255)
    subtitle = models.CharField(max_length=255, blank=True)
    lead = models.TextField(max_length=4096)
    content = models.TextField()
    ...
    last_visited = models.DateTimeField()

Каждый раз, когда выводится мой News объект, я обновляю поле last_visited:

news.last_visited = datetime.datetime.now()
news.save()

Этокод заставляет Django переопределить все поля модели:

UPDATE news SET title='...', subtitle='...', last_visited = '...' WHERE id = '...';

Вместо одного:

UPDATE news SET last_visited = '...' WHERE id = '...';

Меня беспокоит, насколько это плохо и стоит ли думать.

Документация Django предлагает обновление набора запросов, но выглядит не очень элегантно:

def upd(obj, **kwargs):
    obj.__class__._default_manager.filter(pk=obj.pk).update(**kwargs)

upd(news, last_visited=datetime.datetime.now())

Я использую бэкэнд MySQL.

Ответы [ 3 ]

1 голос
/ 18 декабря 2011

Используя обновление, но с более чистым подходом:

class News(models.Model):

    def update_visited(self):
        News.objects.filter(pk=self.pk).update(
                        last_visited=datetime.datetime.now())
0 голосов
/ 18 декабря 2011

Предположим, что вы хотите использовать это более чем в одной модели (догадываясь об этом, потому что вы передаете obj в вашу upd функцию), возможно, имеет смысл иметь некоторый базовый класс, который реализует поле last_visited и ваш * Класс 1004 * наследуется от этого класса ... Тогда вы можете выполнить обновление только для своего базового класса .... Другой возможностью было бы поместить информацию last_visited в отдельную модель и ссылаться на модель News либо через ForeignKey или GenericForeignKey (в случае, если вы хотите сохранить «историю» для разных моделей).

0 голосов
/ 18 декабря 2011

Я думаю, что использование queryset update хорошо. Это исключает возможность случайной замены изменений в других полях.

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

...