Привет всем, я Ян Ган, и статья, которую я принес сегодня, называется «Отношения Django4-один-к-одному, один-ко-многим, многие-ко-многим», надеюсь, она вам поможет!
Среда: Django 2.2.1 + Python 3.6.7
Очевидно, что сила реляционных баз данных заключается в связях между таблицами. Django предоставляет способы определения трех наиболее распространенных отношений базы данных: один-к-одному, один-ко-многим и многие-ко-многим.
один на один
Типичными примерами являются заочный студенческий билет, удостоверение личности соответствует студенческому. Dj документ или другой пример, место (Place) соответствует ресторану (Restaurant). В Dj использование одного отношенияOneToOneFieldПосле ассоциации таблица местоположений может запрашивать данные таблицы ресторанов, а таблица ресторанов также может запрашивать данные таблицы местоположений.
пример:docs.Django project.com/this-functions/2.2…
один ко многим
Типичным примером является то, что в классе есть несколько учеников, и ученик может принадлежать только к определенному классу. Или в случае Dj документов автор (Reporter) может написать несколько статей (Article), и статья принадлежит только одному автору. В Dj отношения «один ко многим» используютForeignKeyассоциировать.
Обратите внимание, что прямой запрос — это таблица статей для проверки данных таблицы авторов, а обратный запрос — это таблица авторов для проверки данных таблицы статей.
Демонстрационный тест официального документа
# R表->R表, A表->A表
# 新建应用associatest, 假定应用已注册
$ python manage.py makemigrations associatest
# 新建Model(与官方文档一致)
https://docs.djangoproject.com/zh-hans/2.2/topics/db/examples/many_to_one/
# 数据迁移效果(makemigrations+sqlmigrate+migrate)
1.表名是”应用名_Model名“的形式, 比如associatest_reporter
2.如果没有声明主键,则会自动加上主键,主键名为id
3.A表的外键名是reporter_id, 与R表的主键(id)关联
# R表增加数据(不会受到A表的影响)
$ python manage.py shell
>>> from associatest.models import Reporter
>>> r = Reporter(first_name='John', last_name='Smith', email='john@example.com')
>>> r.save()
>>> r2 = Reporter(first_name='Paul', last_name='Jones', email='paul@example.com')
>>> r2.save()
# A表增加数据(会受到R表的影响,对应的reporter要存在)
>>> from associatest.models import Article
>>> from datetime import date
>>> a = Article(id=None, headline="test", pub_date=date(2005, 7, 27), reporter=r)
>>> a.save()
# R表筛选数据,得到是一个queryset(条件是A表的字段)
>>> Reporter.objects.filter(article=1)
<QuerySet [<Reporter: John Smith>]>
>>> Reporter.objects.filter(article__headline='test')
<QuerySet [<Reporter: John Smith>]>
# A表筛选数据
>>> Article.objects.filter(reporter__first_name='John')
<QuerySet [<Article: test>]>
# R表查询A表数据(filter得到的是一个queryset, get得到的是一个对象)
>>> r3 = Reporter.objects.get(first_name='John')
>>> r3.Article__set().get(headline='test').id
# A表查询R表数据
>>> a.reporter.first_name
'John'
>>> a.reporter.id
1
# 字段参数
- to_field: 默认情况下reporter字段会关联到R表的主键,但可以通过to_field指定R表的其他字段,前提是指定的字段必须是unique的。
- related_name: 指定反向查询用的字段, 反向查询指R表查A表, 默认字段是Article__set()。 如果不希望反向查询,可将related_name赋值为'+'。
- on_delete: 指定外键被删除时的一些行为
- on_delete=CASCADE: 默认选项, 级联删除(但是model.delete方法是不会删除关联model的数据的,详情查看官方文档)
- PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。
- SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是blank = True, null = True, 定义该字段的时候,允许为空。
- SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
- SET(): 自定义一个值,该值当然只能是对应的实体了
- DO_NOTHING: 不做任何事
- db_column: reporter作为A表的外键, 其在数据表的字段名称会被命名为reported_id(加后缀_id),如果你想避免这种情况, 可以用db_column参数指定字段名称。
многие ко многим
Типичным примером является то, что учитель может вести несколько классов, а класс может вести несколько учителей. Другой пример документов Dj: издатель (Publication) может публиковать несколько статей (Article), а статья может быть опубликована несколькими издателями. В Dj отношения «многие ко многим» используютManyToManyFieldассоциировать.
docs.Django project.com/this-functions/2.2…
Разница между OneToOneRel и OneToOneField:
Модель отношений Django раскрывает только три вышеуказанные модели: OneTooneRel, ManyTooneRel и ManyTomanyrel — класс внутри этих трех.
Ссылаться на:
Запрос ключа Django_foreign и обратный запрос:у-у-у. Краткое описание.com/afraid/20 oh 078 ah 71…
Параметры поля внешнего ключа Django:docs.Django project.com/this-functions/2.2…