首页>>后端>>Python->django如何得到多对多的信息(django多对多关系添加)

django如何得到多对多的信息(django多对多关系添加)

时间:2023-12-02 本站 点击:0

本篇文章首席CTO笔记来给大家介绍有关django如何得到多对多的信息以及django多对多关系添加的相关内容,希望对大家有所帮助,一起来看看吧。

本文目录一览:

1、django 怎么理解一对多 多对多2、django model里怎么实现外键对多种model3、python + django 多表联合查询方法求教4、django many to many 怎么用5、django 多对多怎么插入数据

django 怎么理解一对多 多对多

这其实是传统关系数据的实体关系建模的内容,实体和实体之间的连接关系。

比如说一个人只能有一个父亲,一个父亲可以有多个孩子这就是,父亲和孩子之间就是1对多。

如果父亲有两个弟弟,2个儿子,那父亲的孩子就有2个叔叔,每个叔叔都有个2个侄子,这就叫做多对多。

django model里怎么实现外键对多种model

首先题主用的Django版本是什么,django貌似没见过ForeignModel,根据orm,ForeignKey实际上就是sql里面的外键,个人理解楼主的题目是能不能一个字段对应多个其他表,如下:

class WhatAreYouTryToAsk:

filed_XXX = models.ForeignKey((ModelA,ModelB,))

这是不科学的啊亲,对于sql来说也不会一个字段能对应多个外键,想实现这种效果只能是有一张ModelA,ModelB的中间表,而filed的外键对应这张中间表

class MiddleTable(models.Model):

model_a = models.ForeignKey(ModelA)

model_b = models.ForeignKey(ModelB)

class WhatAreYouTryToAsk:

filed_XXX = models.ForeignKey(MiddleTable)

简单的说就是ModelA和ModelB有一个多对多的关系,上面的方法是显示的指明一个MiddleTable表,实时上可以使用Django里面的ManyToMany,ManyToMany的实际上会建一张中间表,因此你可以在ModelA或ModelB建立一个ManyToMany的字段,具体ManyToMany的用法请查阅文档。

class ModelA(models.Model):

model_bs = ManyToMany(ModelB)

class WhatAreYouTryToAsk:

filed_XXX = models.ForeignKey(ModelA)

# or this, 具体实现看需求

# filed_XXX = models.ForeignKey(ModelB)

python + django 多表联合查询方法求教

先让我们回忆一下在第五章里的关于书本(book)的数据模型:

1

from django.db import models

class Publisher(models.Model):

name = models.CharField(max_length=30)

address = models.CharField(max_length=50)

city = models.CharField(max_length=60)

state_province = models.CharField(max_length=30)

country = models.CharField(max_length=50)

website = models.URLField()

def __unicode__(self):

return self.name

class Author(models.Model):

first_name = models.CharField(max_length=30)

last_name = models.CharField(max_length=40)

email = models.EmailField()

def __unicode__(self):

return u'%s %s' % (self.first_name, self.last_name)

class Book(models.Model):

title = models.CharField(max_length=100)

authors = models.ManyToManyField(Author)

publisher = models.ForeignKey(Publisher)

publication_date = models.DateField()

def __unicode__(self):

return self.title

如我们在第5章的讲解,获取数据库对象的特定字段的值只需直接使用属性。 例如,要确定ID为50的书本的标题,我们这样做:

from mysite.books.models import Book

b = Book.objects.get(id=50)

b.title

u'The Django Book'

但是,在之前有一件我们没提及到的是表现为ForeignKey 或 ManyToManyField的关联对象字段,它们的作用稍有不同。

访问外键(Foreign Key)值

当你获取一个ForeignKey 字段时,你会得到相关的数据模型对象。 例如:

b = Book.objects.get(id=50)

b.publisher

Publisher: Apress Publishing

b.publisher.website

u''

对于用`` ForeignKey``

来定义的关系来说,在关系的另一端也能反向的追溯回来,只不过由于不对称性的关系而稍有不同。 通过一个`` publisher`` 对象,直接获取

books ,用 publisher.book_set.all() ,如下:

p = Publisher.objects.get(name='Apress Publishing')

p.book_set.all()

[Book: The Django Book, Book: Dive Into Python, ...]

实际上,book_set 只是一个 QuerySet(参考第5章的介绍),所以它可以像QuerySet一样,能实现数据过滤和分切,例如:

1

p = Publisher.objects.get(name='Apress Publishing')

p.book_set.filter(name__icontains='django')

[Book: The Django Book, Book: Pro Django]

属性名称book_set是由模型名称的小写(如book)加_set组成的。

访问多对多值(Many-to-Many Values)

多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。 例如,这里是如何查看书籍的作者:

b = Book.objects.get(id=50)

b.authors.all()

[Author: Adrian Holovaty, Author: Jacob Kaplan-Moss]

b.authors.filter(first_name='Adrian')

[Author: Adrian Holovaty]

b.authors.filter(first_name='Adam')

[]

反向查询也可以。 要查看一个作者的所有书籍,使用author.book_set ,就如这样:

a = Author.objects.get(first_name='Adrian', last_name='Holovaty')

a.book_set.all()

[Book: The Django Book, Book: Adrian's Other Book]

这里,就像使用 ForeignKey字段一样,属性名book_set是在数据模型(model)名后追加_set。

更改数据库模式(Database Schema)

3

在我们在第5章介绍 syncdb 这个命令时, 我们注意到 syncdb仅仅创建数据库里还没有的表,它 并不 对你数据模型的修改进行同步,也不处理数据模型的删除。 如果你新增或修改数据模型里的字段,或是删除了一个数据模型,你需要手动在数据库里进行相应的修改。 这段将解释了具体怎么做:

当处理模型修改的时候,将Django的数据库层的工作流程铭记于心是很重要的。

如果模型包含一个未曾在数据库里建立的字段,Django会报出错信息。 当你第一次用Django的数据库API请求表中不存在的字段时会导致错误(就是说,它会在运行时出错,而不是编译时)。

3

Django不关心数据库表中是否存在未在模型中定义的列。

Django不关心数据库中是否存在未被模型表示的表格。

1

改变模型的模式架构意味着需要按照顺序更改Python代码和数据库。

添加字段

1

当要向一个产品设置表(或者说是model)添加一个字段的时候,要使用的技巧是利用Django不关心表里是否包含model里所没有的列的特性。 策略就是现在数据库里加入字段,然后同步Django的模型以包含新字段。

3

然而 这里有一个鸡生蛋蛋生鸡的问题 ,由于要想了解新增列的SQL语句,你需要使用Django的

manage.py sqlall命令进行查看 ,而这又需要字段已经在模型里存在了。 (注意:你并 不是非得使用与Django相同的SQL语句创建新的字段,但是这样做确实是一个好主意 ,它能让一切都保持同步。)

3

这个鸡-蛋的问题的解决方法是在开发者环境里而不是发布环境里实现这个变化。 (你正使用的是测试/开发环境,对吧?)下面是具体的实施步骤。

首先,进入开发环境(也就是说,不是在发布环境里):

在你的模型里添加字段。

运行 manage.py sqlall [yourapp] 来测试模型新的 CREATE TABLE 语句。 注意为新字段的列定义。

开启你的数据库的交互命令界面(比如, psql 或mysql , 或者可以使用

manage.py dbshell )。 执行 ALTER TABLE 语句来添加新列。

使用Python的manage.py shell,通过导入模型和选中表单(例如,

MyModel.objects.all()[:5] )来验证新的字段是否被正确的添加 ,如果一切顺利,所有的语句都不会报错。

3

然后在你的产品服务器上再实施一遍这些步骤。

启动数据库的交互界面。

5

执行在开发环境步骤中,第三步的ALTER TABLE语句。

将新的字段加入到模型中。 如果你使用了某种版本控制工具,并且在第一步中,已经提交了你在开发环境上的修改,现在,可以在生产环境中更新你的代码了(例如,如果你使用Subversion,执行svn update。

重新启动Web server,使修改生效。

让我们实践下,比如添加一个num_pages字段到第五章中Book模型。首先,我们会把开发环境中的模型改成如下形式:

class Book(models.Model):

title = models.CharField(max_length=100)

authors = models.ManyToManyField(Author)

publisher = models.ForeignKey(Publisher)

publication_date = models.DateField()

**num_pages = models.IntegerField(blank=True, null=True)**

def __unicode__(self):

return self.title

django many to many 怎么用

这个问题比较复杂,根本在于你要理解什么是多对多。

举个例子:一个作者可以写多本书,每本书也可以有多个作者。

这就是多对多,体现在Django的ORM中就是:作者模型和书模型之中的一方,需要添加一个ManyToManyField字段。注意是一方,不是双方,只需要添加一个字段不是两个字段。

更详细的内容可以阅读我的博客。

django 多对多怎么插入数据

首先你需要建立django的对象模型

建立两个模型之间的关系表

将数据保存到关系表中。

具体的插入方法,可以参考:

如果解决了您的问题请采纳!

如果未解决请继续追问

结语:以上就是首席CTO笔记为大家介绍的关于django如何得到多对多的信息和django多对多关系添加的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Python/10202.html