#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