Пользовательская проверка ManyToManyField в Django - PullRequest
2 голосов
/ 31 марта 2011

Я создал многоканальное поле для модели. Когда эта модель сохранена, Я хотел бы запустить валидатор в поле m2m.

Проблема : метод validate не вызывается; как в полях чужих.

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

Пример модели:

class Member(models.Model):
    ''' Stores mailinglist members. These are no django-system users. '''
    owner = models.ForeignKey(Owner)
    first_name = models.CharField(max_length=80, blank=True)
    last_name = models.CharField(max_length=80, blank=True)
    categories = CustomManyToManyField(Category)


class Category(models.Model):
    ''' Categories corresponding to a site and system user. '''
    owner = models.ForeignKey(Owner)
    name = models.CharField(max_length=80)

Когда я создаю или обновляю участника и добавляю категорию, я хочу сравнить, если
member.owner == category.owner. CustomManyToManyField должен сделать эту проверку.

Каким-то образом я должен переопределить метод сохранения / проверки.

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

1 Ответ

0 голосов
/ 01 апреля 2011

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

Попробуйте создать определение в категории, которое вызывается при обновлении членов и добавлении категорий, которые передаются в категории и проверяют информацию соответствующим образом.например, в вашем классе Member добавьте следующее определение:

def compare_owner(self, category):
    if self.owner == category.owner :
        return true;
    else
        return false;

Теперь, когда вы находитесь внутри представления, вы можете вызвать это определение из объекта Member.

member = Member(pk=2);
category = Category(pk=3);
if member.compare_owner(category) :
    //success;
...