Модели Django - проверка связанных объектов - PullRequest
1 голос
/ 14 марта 2012

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

Например:

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 равен ' sale ', price_sale должен быть установлен или иначе равен нулю?
  • Как я могу убедиться, что по крайней мереодин image вставлен, но не более, чем, скажем, 10 изображений?

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

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

1 Ответ

0 голосов
/ 14 марта 2012

Попробуйте явно создать свою таблицу сопоставления, и пусть ваши отношения 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...