2016-10-16 2 views
1

Я пытаюсь создать правильную модель Django, которые могли бы соответствовать следующим Reqs:модели в Python Django не работают многие ко многим отношений

Person класса имеет от 1 до многих отношениях с адресами класса

Person Класс имеет много ко многим отношений с группой класса

книги класса содержит коллекции лиц и группы

Это мой код:

class Person(models.Model): 
    first_name = models.CharField(max_length=15) 
    last_name = models.CharField(max_length=20) 

    def __str__(self): 
     return self.first_name+ ' - ' + self.last_name 


class Address(models.Model): 
    person = models.ForeignKey(Person) 
    address_line = models.CharField(max_length=200) 

    def __str__(self): 
     return self.address_line 


class Group(models.Model): 
    group_name = models.CharField(max_length=12) 
    persons = models.ManyToManyField(Person) 

    def __str__(self): 
     return self.group_name 

class Book(models.Model): 
    record_name = models.CharField(max_length=12) 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 

    def __str__(self): 
     return self.record_name 

Однако это неправильное: 1) Группа теперь может содержать несколько лиц, но Лица не содержат никакой группы. Я не уверен, если я должен добавить к классу Person следующий код:

groups = models.ManyToManyField(Group) 

2) Класс Book теперь содержит только 1 запись Person & группы в книге записи.

3) Когда я добавил внешние ключи к моделям, я удалил on_delete тег:

person = models.ForeignKey(Person, on_delete=models.CASCADE()) 

, потому что он не компилирует его, прося некоторых Params.

Я знаю, как сделать все это для C#, но я как бы пробовал эту простую задачу в Python/Django.

+0

. Это не верно. Внешний ключ создает двунаправленную связь между объектами, поэтому 'person.group_set.all()' даст вам группы, к которым принадлежит человек. Кроме того, ваш дизайн уязвим для проблем с согласованностью. Я не уверен, что это должно быть разрешено вашим дизайном, но книга может принадлежать человеку, принадлежащему к другой группе, чем книга. – ozgur

ответ

1

1) Поле ManyToMany должно появляться только в одной из моделей, а также в виде вещей, которые вы, вероятно, хотите получить в модели Person. Важно понимать, что данные о поле ManyToMany сохраняются в таблице различий. Django позволяет этому полю быть видимым только через модели buth (так что, в основном, выберите, где это удобно).

2) По внешнему виду вашей структуры я предлагаю вам использовать поле ManyToMany через другую таблицу. Вот пример: «Группа может содержать несколько Теперь лица, но лица не содержат какой-либо группы»

class Activity(models.Model): 
    name = models.CharField(max_length=140) 
    description = models.TextField(blank=True, null=True) 

class Route(models.Model): 
    title = models.CharField(max_length=140) 
    description = models.TextField() 
    activities_meta = models.ManyToManyField(Activity, through = 'RouteOrdering') 

class RouteOrdering(models.Model): 
    route = models.ForeignKey(Route, on_delete=models.CASCADE) 
    activity = models.ForeignKey(Activity, on_delete=models.CASCADE, related_name='activita') 
    day = models.IntegerField() 
    order = models.IntegerField(default=0) 

таким образом данные переплетены в поле ManyToMany

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