Модели Django, переопределяющие сохранение / использование сигнала / или использование модели? - PullRequest
2 голосов
/ 05 июня 2009

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

Допустим, у нас есть следующее:

models.py

class TestClass(models.Model):
    user = models.ForeignKey(User)
    testfield = models.CharField()
    testbool = models.BooleanField(default=False)

def save(self, *args, **kwargs):
    """
    - what we're trying to do here is ensure that the User doesn't have more than
      X (lets say 5) related test fields.
    - what if we also wanted to add validation to testfield to ensure it was 
      only [a-zA-Z]?
    """
    if TestClass.objects.filter(user=self.user).count() >= 5:
        # How do we exit gracefully?
        return 
    super(TestClass, self).save(*args, **kwargs)

Комментарии в функции сохранения в значительной степени подводят итог моего вопроса: - Как мы можем гарантировать, что для данного пользователя не более 5 связанных TestClass? - Как изящно выйти из сохранения (без сохранения), если уже есть 5 - Как мы можем сообщить об этом обратно пользователю? - где мы проверяем объект тестового поля, чтобы убедиться, что он имеет только [a-z]? Могу ли я просто импортировать и сделать это здесь? должен я?

Лучше ли бросить все это здесь? Должен ли я запустить сигнал pre_save? Или мне просто использовать ModelForm с валидацией?

1 Ответ

0 голосов
/ 05 июня 2009

Вы правы, что в настоящее время нет очевидного места для этого. Вот почему сейчас идет проект Summer of Code для добавления проверки на уровне модели, которая должна сделать такие вещи приятными и легкими.

К сожалению, он не будет готов в течение нескольких месяцев. Между тем, ваш ответ зависит от того, как данные добавляются. Будет ли это когда-нибудь сделано программно или всегда будет через форму? Если последнее, то введение валидации в форму - это путь (обратите внимание, что вы можете использовать ту же модель или ее подклассы как в админском, так и в вашем собственном представлении, поэтому нет необходимости дублировать логику). *

...