2015-07-29 2 views
1

Я хотел бы моделировать отношения между пользователями. Например: знают ли они друг друга?Django: Отношения между пользователями (хранить уникальные пары/комбинации)

Вот мое первое предположение:

class Relation(models.Model): 
    a = models.ForeignKey(User, related_name='related_a') 
    b = models.ForeignKey(User, related_name='related_b') 
    met = models.BooleanField(default=False) 

    class Meta: 
     unique_together = ('a', 'b') 

Очевидно, что эта модель позволяет a == b и иметь два Relation экземпляров для тех же двух людей.

Чтобы решить, что я пытался добавить материал в методе save() и в ModelForm проверить a.id < b.id, так что я могу получить только один Relation для 2 данного народа, но это не является интуитивно понятным в использовании (мы должны угадать хороший заказ, когда мы хотим добавить Relation)

Есть ли лучший способ сохранить уникальную пару (комбинации) в моделях Django?

Спасибо.

+1

Вы пытались расширить модель User, чтобы добавить поле, скажем, 'knownuser = models.ManyToManyField ('auth.User', blank = True)' –

+0

Если был только один (или несколько) 'models.BooleanField', это было бы правильным делом; но в моем приложении есть также 'models.IntegerField' и даже' models.DateField' :( – Nim

ответ

1

Для быстрого исправления я бы использовал обработчик сигнала m2m_changed pre_add, который «помещает a и b в правильном порядке».

Для «правильного» решения я бы использовал часть «Symmetrical Relationships - the Facebook model» из блога http://charlesleifer.com/blog/self-referencing-many-many-through/.

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

+0

Да, я думаю, что «симметричные отношения» (то есть дублирование отношений ab и ba) - хороший ответ для моего случая использования , спасибо! И спасибо за ссылку в блоге, кстати, это выглядит довольно хорошо :) – Nim

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