注意Django的生成的默认api

from django.db import models

class Place(models.Model):
'''
  pass class Restaurant(models.Model):
place = models.OneToOneField(
Place,
on_delete=models.CASCADE,
primary_key=True,
)
serves_hot_dogs = models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False) def __str__(self): # __unicode__ on Python 2
return "%s the restaurant" % self.place.name class Waiter(models.Model):
restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
name = models.CharField(max_length=50) def __str__(self): # __unicode__ on Python 2
return "%s the waiter at %s" % (self.name, self.restaurant)

place_instance.restaurant 引用对应的 restaurant,为 Model `Restaurant`名称的 lower() 形式

restaurant.place,通过字段名称 `place` 引用


restaurant_instance.waiter_set 与 restaurant_instance.waiter 有什么不同?

现在发现时有 Manytomany 的一边引用另一个 model,不需要加 _set,反之,需要加 _set。两者都是相互引用的名称,没有区别

related_name 中可以定义这个名称,在 Manytomany 中两边的名称分别是什么?

django 官方教程

Django OneToOneField, ManyToManyField, Foreign Key

Imagine a database, which stores your book collection:

from django.db import models

class Place(models.Model):
address = models.CharField(max_length=50)
country = models.CharField(max_length=50) class Publisher(models.Model):
name = models.CharField(max_length=30)
place = models.OneToOneField(Place, primary_key=True) class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40) class Book(models.Model):
title = models.CharField(max_length=100)
publisher = models.ForeignKey(Publisher)
authors = models.ManyToManyField(Author)

One-to-many/Foreign Key  

Every Book has one Publisher, but a Publisher might have published multiple books. Therefore they are in a one-to-many (book-to-publisher) relationship. So,

class Book(models.Model):
    publisher = models.ForeignKey(Publisher, realted_name='books')

should be read: "Book is the foreign key of publisher". `publisher` is a attribute of book, a book only has one publisher, `book.publisher` is a instance of `Publisher`.

`publisher` can access books by related_name `books`, `publisher.books` is a queryset of `Book`.

外键是 one to many 中 many 的一方, related_name 是 Publisher 访问 Book 的名称,是单获取多的名字。

外键的自联接

class City(BaseModel):
'''
城市
'''
name = models.CharField(max_length=64, verbose_name='名称')
# 从1开始
level = models.SmallIntegerField(null=True, blank=True, verbose_name='级别')
search_count = models.IntegerField(default=0, verbose_name="搜索次数")
upper_city = models.ForeignKey('self', related_name='sub_cities', on_delete=models.CASCADE)

以国家--省--市的级别。

如广东省

广东省.upper_city = 中国
广东省.sub_cities = City Queryset [广州、深圳、珠海]

  

One-to-one

Every Publisher is located in one Place, and every Place can only hold one Publisher. Therefore they are in a one-to-one relationship. You could just have well have put the Place information (address and country) with the Publisher model in one table, but sometimes it is preferred to have seperate models. For example, if you do not know the Place for every Publisher, you don't need to take up a lot of space with empty rows.

Many-to-many

Every Book also has one or more Authors. However, an Author might have written multiple Books, so they are in a many-to-many relationship.

If you still need some guidance, I suggest taking a look at the model chapter of the Django Book.

The apis of different relations

base apis

manytomany

Related objects reference

add

remove

clear 等等

问:Related objects reference 中的方法是怎么实现的?

首先要弄懂 Foreignkey 的方法是怎么实现的

问:弄懂 Foreignkey 的方法是怎么实现的

 1. 两个 models 之间如何相互引用的?

2. 增删查改

问:intermediary model

如何通过 intermediary model 取出数据?

通过对应的字段 id 取出,见 Associative_entity

intermediary model 的作用

可以用来储存关系之外的信息,比如这个关系的建立日期,建立条件等

用来取到不同的值,比如默认是取 pk,但是现在能取到 username

遇到的问题

AttributeError}Cannot set values on a ManyToManyField which specifies an intermediary model.

原因:many2many 自带的 api 不再适用

Unlike normal many-to-many fields, you can't use add, create, or assignment (i.e., beatles.members = [...]) to create relationships

解决:

在中间表加上

class Membership(models.Model):
class Meta:
auto_created = True

来源

 问:Django 自带的 ManyToManyField 是如何实现的,有没有使用 intermediary model

搜索了一下,没有找到满意的答案。于是查看添加 ManyToManyField 后的 sql 语句。

下面是将一个 CharField 改为 ManyToManyField 后,Django 生成的 sql 语句

app_name: business, related_model_name: Client, Industry

BEGIN;
--
-- Remove field industry from client
--
ALTER TABLE `business_client` DROP COLUMN `industry` CASCADE;
--
-- Add field industry to client
--
CREATE TABLE `business_client_industry` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `client_id` integer NOT NULL, `industry_id` integer NOT NULL);
ALTER TABLE `business_client_industry` ADD CONSTRAINT `business_client_industr_client_id_0cf3c644_fk_business_client_id` FOREIGN KEY (`client_id`) REFERENCES `business_client` (`id`);
ALTER TABLE `business_client_industry` ADD CONSTRAINT `business_client_ind_industry_id_4e2c4fda_fk_business_industry_id` FOREIGN KEY (`industry_id`) REFERENCES `business_industry` (`id`);
ALTER TABLE `business_client_industry` ADD CONSTRAINT `business_client_industry_client_id_06a60532_uniq` UNIQUE (`client_id`, `industry_id`); COMMIT;

从上面可以看出:

1. ManyToManyField 也生成了一个中间表 CREATE TABLE `business_client_industry`

2. 在中间表中创建外键

3. 自动增加了一个 UNQUE 约束

问:为什么使用 intermediary model时不能使用 clear 之外的方法?

既然同样都是通过中间表引用,为什么到了这里那些方法就不能用了呢?

实际测试一下再来作答

因为要建立联系,必须要在中间表中建立数据。而 clear 之外的那些方法做不到。

You can’t just create a relationship between a Person and a Group - you need to specify all the detail for the relationship required by the Membership model. The simple addcreate and assignment calls don’t provide a way to specify this extra detail. As a result, they are disabled for many-to-many relationships that use an intermediate model. The only way to create this type of relationship is to create instances of the intermediate model.

 clear 为什么能做到?

clear 是将那个属性设置为  None,只是破坏单边关系吧?为什么说破坏了 many to many relationship?

是不是一边为空就会破坏 many to many 的关系?

问:如何做城市选择?

服务端如何做国内外选择城市功能

问:Django model循环引用

解决:http://stackoverflow.com/questions/4813293/django-python-circular-model-reference

原理: 懒加载

django database relations的更多相关文章

  1. Django中如何配置Database缓存?

    BACKEND: django.core.cache.backends.db.DatabaseCache LOCATION: 数据库表名 示例: CACHES = { 'default': { 'BA ...

  2. Django中如何使用django-celery完成异步任务1(转)

    原文链接: http://www.weiguda.com/blog/73/ 本篇博文主要介绍在开发环境中的celery使用,请勿用于部署服务器. 许多Django应用需要执行异步任务, 以便不耽误ht ...

  3. Django使用manage.py备份与恢复数据

    Django dumpdata and loaddata django database model dumpdata dumpdata command It is a django manageme ...

  4. Django学习笔记之使用 Django项目开发框架

    Django 项目是一个定制框架,它源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来.Django 框架的核心组件有: 用于创建模型的对象关系映射 为最终用户设计的完美管理界面 ...

  5. Django 初始化数据库

    django 初始化数据库 刷新数据库guoguos-MacBook-Pro:mysite guoguo$ python manage.py sqlflushBEGIN;SET FOREIGN_KEY ...

  6. Celery 分布式任务队列快速入门

    Celery 分布式任务队列快速入门 本节内容 Celery介绍和基本使用 在项目中如何使用celery 启用多个workers Celery 定时任务 与django结合 通过django配置cel ...

  7. UML类图中箭头的含义

    Explanation of the UML arrows Here's some explanations from the Visual Studio 2015 docs: UML Class D ...

  8. Professional C# 6 and .NET Core 1.0 - Chapter 42 ASP.NET Web API

    本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处: -------------------------------------------------------- ...

  9. 【转】Celery 分布式任务队列快速入门

    Celery 分布式任务队列快速入门 本节内容 Celery介绍和基本使用 在项目中如何使用celery 启用多个workers Celery 分布式 Celery 定时任务 与django结合 通过 ...

随机推荐

  1. JavaScript内存示意图

    一.JavaScript内存示意图 二.js原理 1.js执行规则 (1)先定义 定义变量.定义函数.顺序:自上而下. (2)后执行 除了定义外的代码都是执行代码.顺序:自上而下. 2.动态开辟内存 ...

  2. Android 必知必会 - 依据包名推断 App 执行状态

    假设移动端訪问不佳,请訪问: 掘金版 Github 版 获取指定包名的 APP 是否还在后台执行,推断 APP 是否存活. 背景 能够依据 App 是否有 Service 分两类情况处理: 没有 Se ...

  3. Kubernetes使用prometheus+grafana做一个简单的监控方案

    前言 本文介绍在k8s集群中使用node-exporter.prometheus.grafana对集群进行监控.其实现原理有点类似ELK.EFK组合.node-exporter组件负责收集节点上的me ...

  4. 用JS将json日期格式化成正常日期

       function ChangeDateFormat(cellval) {             var date = new Date(parseInt(cellval.replace(&qu ...

  5. Connect China Azure Storage Blob By Container Token In Python SDK

    简介: 基于Python SDK,使用Container Token操作container对象.关于Token的生成可以使用Storage SDK创建,也可以使用工具快速创建供测试. 示例代码: fr ...

  6. mvc模型绑定问题

    public void AddDesk(x_s_desk x_s_desk) 绑定的到 public void AddDesk(x_s_desk desk) 绑定不到 目前不知道原因 且仅有部分模型需 ...

  7. asp.net core mvc视频A:笔记6-1.应用发布与部署

    显示:直接使用上节课的项目 一.使用vs发布应用 这里选择发布到文件夹,当然你可以选择其他的发布方式 部署模式:(我的VS里没有这个配置,不知道为啥...视频里有) 1.框架依赖:选择此模式,发布后需 ...

  8. vue 跨域:使用vue-cli 配置 proxyTable 实现跨域问题

    路径在/config/index.js 中,找到dev.proxyTable.如下配置示例: proxyTable: { '/api': { // 我要请求的地址 target: 'http://oa ...

  9. unity, 集成iOS广告sdk注意事项

    ----更新:2015-10-22 今天在unity里集成讯飞语音听写的iOS sdk,结果发现前面集成domob广告的方法搞复杂了. 其实,直接把UnityViewControllerBase当做s ...

  10. Linux Ctrl+z bg fg jobs命令使用

    一.暂停前台运行时间长的程序 使用Ctrl + z然后可以看到系统提示: []+ Stopped /home/test/demo.sh 二.bg命令 将程序放到后台处理 bg  %jobnumber ...