Администратор Django: ограничить отношения «многие ко многим» только что созданными - PullRequest
0 голосов
/ 14 декабря 2010

Моя проблема в том, что я не знаю, как выразить свой дизайн в терминах реляционных БД.

У меня есть класс «Feat», который должен содержать несколько других классов, а именно списки «Stat», «Skill's» и «Attribute's». Точное число из них зависит от экземпляра «Feat», поэтому я не могу просто определить статическое количество полей.

В обычном Python я бы просто использовал списки:

class Feat():
    name
    desc
    att_effects = []
    skill_effects = []
    stat_effects = []

Я пытался повторить это в Django, используя отношение «многие ко многим», но это не совсем сработало.

class Attribute_Name(models.Model):
    name =  models.CharField(max_length=100)
    desc = models.TextField()
    def __unicode__(self):
        return str(self.name)

...

class Attribute(models.Model):
    name = models.ForeignKey(Attribute_Name)
    value = models.IntegerField()
    def __unicode__(self):
        return "%s: %s" % (self.name, self.value)

...

class Feat(models.Model):
    name = models.CharField(max_length=100)
    desc = models.TextField()
    att_effects = models.ManyToManyField(Attribute)
    skill_effects = models.ManyToManyField(Skill)
    stat_effects = models.ManyToManyField(Stat)

С этими моделями я мог создавать новые «Атрибуты» при создании нового «Подвига» в интерфейсе администратора. Тем не менее, я всегда видел бы все существующих «Атрибутов», а не только те, которые относятся к моему новому «Подвигу». Есть ли способ ограничить вид только теми, которые созданы вместе с новым «Подвигом»? Что-то вроде обратной ссылки на «Подвиг», который создал «Атрибут»?

По сути, когда я создаю или редактирую «Подвиг», я должен иметь возможность только использовать «Атрибут, созданный на странице этого экземпляра, или добавить новый экземпляр« Атрибут ». Я не хочу, чтобы «принадлежность атрибута к другому« подвигу »(или другому не связанному классу) обнаруживалась.

Обратите внимание, что я не хочу добавлять поле в класс 'Attribute', поскольку оно также должно использоваться вместе с другими классами (например, 'Character')

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

В связанной заметке: есть ли способ оставить поле «многие ко многим» пустым? Или мне просто создать магическое «пустое» значение и установить его по умолчанию?

1 Ответ

1 голос
/ 14 декабря 2010

"есть ли способ ограничить вид только теми, которые были созданы вместе с новым« Подвигом »? Что-то вроде обратной ссылки на« Подвиг », который создал« Атрибут »?

Да: используйте функцию набора запросов ModelAdmin , как описано в этом вопросе

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