Django: установка максимального количества уникальных полей в модели - PullRequest
1 голос
/ 05 февраля 2011

Я использую Django 1.2.Я хотел бы сделать модель с 3 полями, как показано ниже:

class Also_Viewed(models.Model):
    page = models.ForeignKey(Page)
    also_page = models.ForeignKey(Page)
    rank = models.IntegerField()
    class Meta:
        unique_together = ('page', 'also_page')

Однако для каждого уникального поля страницы я хочу ограничить количество строк в таблице максимальным количеством (скажем, 24).

Так, например, следующие типы строк будут в порядке ...

(Page_A, Page_x, 3)
(Page_A, Page_y, 21)
...
(Page_A, Page_z, 45)

... до 24 вхождений в таблице.

Как бы вы порекомендовали установить это ограничение в файле Django models.py?

Единственный способ, которым я могу придумать, - это добавить другое поле и установить для опции choices значение итерируемого из 24 значений.кортежи.Это похоже на взлом, но действительно ли это правильное решение?Или вы можете придумать более элегантные и эффективные решения?

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

Большое спасибо за помощь, она очень ценится!

1 Ответ

2 голосов
/ 05 февраля 2011

Если вы используете свои собственные представления, вы можете использовать проверку модели как место для размещения этого кода. (но помните, что вы должны называть себя чистым)
http://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects

Если вы хотите, чтобы это было принудительно введено администратором, вам нужно переопределить формы администратора. http://docs.djangoproject.com/en/dev/ref/contrib/admin/#adding-custom-validation-to-the-admin

# pseudocode. If you went the route of admin forms, 
# the ModelForms would use self.cleaned_data[attr]

if self.page == self.also_page: 
    raise models(or forms).ValidationError("Pages are the same")

elif Also_Viewed.objects.filter(page=self.page).count() >= 24:
    raise models(or forms).ValidationError("Can not have more than 24 items for %s" % self.page)

# let the unique_together catch uniqueness.
...