Модели в Python Django не работают для отношений «Многие ко многим»

#python #django #django-models

#python #django #django-модели

Вопрос:

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

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

Класс Person имеет отношения «многие ко многим» с классом Group

Класс Book содержит коллекции лиц и групп

Это мой код:

 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 amp; Group для каждой записи книги.

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

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

потому что он не компилирует его, запрашивая некоторые параметры.

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

Комментарии:

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

Ответ №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