首页 > 编程 > Python > 正文

django之跨表查询及添加记录的示例代码

2020-02-15 23:14:42
字体:
来源:转载
供稿:网友

创建表

书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);

一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many)。

创建一对一的关系:OneToOne("要绑定关系的表名")

创建一对多的关系:ForeignKey("要绑定关系的表名")

创建多对多的关系:ManyToMany("要绑定关系的表名")  会自动创建第三张表

class Book(models.Model):  nid = models.AutoField(primary_key=True) # 自增id(可以不写,默认会有自增id)  title = models.CharField(max_length=32)  publishDdata = models.DateField() # 出版日期  price = models.DecimalField(max_digits=5, decimal_places=2) # 一共5位,保留两位小数  #一个出版社有多本书,关联字段要写在多的一方  # 不用命名为publish_id,因为django为我们自动就加上了_id  publish = models.ForeignKey("Publish") #foreignkey(表名)建立的一对多关系  # publish是实例对象关联的出版社对象  authorlist = models.ManyToManyField("Author") #建立的多对多的关系  def __str__(self): #__str__方法使用来吧对象转换成字符串的,你返回啥内容就打印啥    return self.titleclass Publish(models.Model):  #不写id的时候数据库会自动给你增加自增id  name =models.CharField(max_length=32)  addr = models.CharField(max_length=32)  def __str__(self):    return self.nameclass Author(models.Model):  name = models.CharField(max_length=32)  age = models.IntegerField()class AuthorDeital(models.Model):  tel = models.IntegerField()  addr = models.CharField(max_length=32)  author = models.OneToOneField("Author") #建立的一对一的关系

注意:临时添加的字段,首先你得考虑之前的数据有没有。设置一个默认值。

wordNum = models.IntegerField(default=0)  

通过logging可以查看翻译成的sql语句

LOGGING = {  'version': 1,  'disable_existing_loggers': False,  'handlers': {    'console':{      'level':'DEBUG',      'class':'logging.StreamHandler',    },  },  'loggers': {    'django.db.backends': {      'handlers': ['console'],      'propagate': True,      'level':'DEBUG',    },  }}  

注意事项:

1、 表的名称myapp_modelName,是根据 模型中的元数据自动生成的,也可以覆写为别的名称  

2、id 字段是自动添加的

3、对于外键字段,Django 会在字段名上添加"_id" 来创建数据库中的列名

4、这个例子中的CREATE TABLE SQL 语句使用PostgreSQL 语法格式,要注意的是Django 会根据settings 中指定的数据库类型来使用相应的SQL 语句。

5、定义好模型之后,你需要告诉Django _使用_这些模型。你要做的就是修改配置文件中的INSTALL_APPSZ中设置,在其中添加models.py所在应用的名称。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表