2012-03-14 5 views
1

Мне интересно, как иметь валидации для связанных объектов. К моему удивлению, я не нашел много важной информации об этом.Проверка моделей связанных с Django

Например:

class Listing(models.Model): 
    categories = models.ManyToManyField('Category') 
    price_sale = models.DecimalField(max_digits=8, decimal_places=0, null=True) 
    price_rent = models.DecimalField(max_digits=8, decimal_places=0, null=True) 
    price_vacation = models.DecimalField(max_digits=8, decimal_places=0, null=True) 

class Category(models.Model): 
    value = models.CharField(max_length=32) 

class Image(models.Model): 
    listing = models.ForeignKey('Listing') 
    image = models.ImageField(upload_to=get_file_path) 
  • Как я могу убедиться, что по крайней мере один category установлен, нет дубликатов для листинга?
  • Как я могу убедиться, что если один из categories является «продажа», price_sale должен быть установлен или же установить значение null?
  • Как я могу убедиться, что вставлен хотя бы один image, но не более чем сказать 10 изображений?

Я думаю, что это должно быть сделано в модели на случай, если я выберу данные вне форм (что-то вроде разбора фида), будет ли это правильно? Я пробовал иметь дело с clean(), но для этого требуется ПК, прежде чем позволить мне разобраться с отношениями m2m и т. Д.

Вопрос с бонусом: Почему я решил ограничить поле, используя варианты, а не ограничивать FK?

ответ

0

Попробуйте явно создать таблицу сопоставления, и ваши отношения ManyToMany пройдут through этой модели. Поскольку это нормальная модель Django, вы должны определить большую часть своей логики проверки в своем методе clean.

class Listing(models.Model): 
    categories = models.ManyToManyField('Category', through='CategoryListing') 
    price_sale = models.DecimalField(max_digits=8, decimal_places=0, null=True) 
    price_rent = models.DecimalField(max_digits=8, decimal_places=0, null=True) 
    price_vacation = models.DecimalField(max_digits=8, decimal_places=0, null=True) 

class Category(models.Model): 
    value = models.CharField(max_length=32) 

class CategoryListing(models.Model): 
    category = models.ForeignKey(Category) 
    listing = models.ForeignKey(Listing) 

    def clean(self): 
     # validation logic 

https://docs.djangoproject.com/en/1.3/topics/db/models/#intermediary-manytomany

+0

Это будет больше для проверки объединения строк таблицы сама по себе, а не по отношению к 'listing' нет? Я бы хотел, чтобы «листинг» был вставлен без какого-либо отношения m2m. – RS7

Смежные вопросы