Python Web框架之Django框架Model基础详解


当前第2页 返回上一页

id:关系的主键。

<containing_model>_id:声明ManyToManyField 字段的模型的id。
<other_model>_id:ManyToManyField 字段指向的模型的id。

如果ManyToManyField 的源模型和目标模型相同,则生成以下字段:

id:关系的主键。
from_<model>_id:源模型实例的id。
to_<model>_id:目标模型实例的id。

这个类可以让一个给定的模型像普通的模型那样查询与之相关联的记录。

    to,                         # 要进行关联的表名
    related_name=None,          # 反向操作时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all()
    related_query_name=None,    # 反向操作时,使用的连接前缀,用于替换【表名】     如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名')
    limit_choices_to=None,      # 在Admin或ModelForm中显示关联数据时,提供的条件:
        # 如:
            - limit_choices_to={'nid__gt': 5}
            - limit_choices_to=lambda : {'nid__gt': 5}

            from django.db.models import Q
            - limit_choices_to=Q(nid__gt=10)
            - limit_choices_to=Q(nid=8) | Q(nid__gt=10)
            - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')

   symmetrical=None,# 仅用于多对多自关联时,symmetrical用于指定内部是否创建反向操作的字段
                # 做如下操作时,不同的symmetrical会有不同的可选字段
                    models.BB.objects.filter(...)
                    # 可选字段有:code, id, m1
                        class BB(models.Model):
                        code = models.CharField(max_length=12)
                        m1 = models.ManyToManyField('self',symmetrical=True)
                    # 可选字段有: bb, code, id, m1
                        class BB(models.Model):
                        code = models.CharField(max_length=12)
                        m1 = models.ManyToManyField('self',symmetrical=False)
        through=None,               # 自定义第三张表时,使用字段用于指定关系表
        through_fields=None,        # 自定义第三张表时,使用字段用于指定关系表中那些字段做多对多关系表
            from django.db import models
            class Person(models.Model):
                name = models.CharField(max_length=50)
            class Group(models.Model):
                name = models.CharField(max_length=128)
                members = models.ManyToManyField(
                    Person,
                    through='Membership',
                    through_fields=('group', 'person'),
                )
            class Membership(models.Model):
                group = models.ForeignKey(Group, on_delete=models.CASCADE)
                person = models.ForeignKey(Person, on_delete=models.CASCADE)
                inviter = models.ForeignKey(
                    Person,
                    on_delete=models.CASCADE,
                    related_name="membership_invites",
                )
                invite_reason = models.CharField(max_length=64)
        db_constraint=True,         # 是否在数据库中创建外键约束
        db_table=None,              # 默认创建第三张表时,数据库中表的名称

OneToOneField

一对一关联关系。概念上讲,这个字段很像是ForeignKey 设置了unique=True,不同的是它会直接返回关系另一边的单个对象。

它最主要的用途是作为扩展自另外一个模型的主键;例如,多表继承就是通过对子模型添加一个隐式的一对一关联关系到父模型实现的。

需要一个位置参数:与该模型关联的类。 它的工作方式与ForeignKey 完全一致,包括所有与递归关系和惰性关系相关的选项。

以下内容个人理解笔记:

    class News(models.Model):
      title = models.CharField(max_length=10)
      favor = models.ManyToManyField('User',through="Favor",through_fields=("new_obj", 'user_obj'))
# obj = models.News.objects.get(id=1)
# v = obj.favor.all()
# print(v)
# obj.favor.add(1)不能用
# obj.favor.remove(1)不能用
# v = obj.favor.all()能用
# obj.favor.clear()能用,根据id删,不用name这个字段
# v = models.User.objects.all()
# v = models.User.objects.all().select_related('user_type')class User(models.Model):
      name = models.CharField(max_length=10)
      email = models.EmailField(max_length=10)
      user_type = models.ForeignKey('UserType') # 一对多
      # user_profile = models.ForeignKey('UserDetail',unique=True)
      user_profile = models.OneToOneField('UserDetail')
    class UserDetail(models.Model):
      pwd = models.CharField(max_length=32)
    class Favor(models.Model):
      new_obj = models.ForeignKey('News',related_name="n")
      user_obj = models.ForeignKey('User',related_name='u')
      name = models.CharField(max_length=64,null=True,blank=True)
    class UserType(models.Model):
      name = models.CharField(max_length=10)


访问外键(Foreign Key)值

python manage.py shell

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

>>> from django.db import connection
>>> from app01.models import User
>>> u=User.objects.get(id=1)
>>> u
<User: User object>
>>> u.user_type
<UserType: UserType object>
>>> u.user_type.name
'type1'

对于用ForeignKey 来定义的关系来说,在关系的另一端也能反向的追溯回来,
通过一个UserType对象,直接获取 user ,用 UserType.user_set.all() ,

实际上,user_set 只是一个 QuerySet(参考第5章的介绍),

所以它可以像QuerySet一样,能实现数据过滤和分切,属性名称user_set是由模型名称的小写加_set组成的。

>>> from app01.models import UserType
>>> t=UserType.objects.get(name='type1')
>>> t.user_set.all()
<QuerySet [<User: User object>, <User: User object>]>

  • 多对多

正向查找

>>> from app01.models import News
>>> n=News.objects.get(id=1)
>>> n.favor.all()
<QuerySet [<User: User object>, <User: User object>]>
>>> n.favor.filter(name='nu1')
<QuerySet [<User: User object>]>

反向查找

>>> u.news_set.all()
<QuerySet [<News: News object>]>

希望本文所述对大家基于Django框架的Python程序设计有所帮助。


标签:SQLite

返回前面的内容

相关阅读 >>

Sqlite与mysql区别及优缺点介绍

android数据库sd卡创建和图片存取操作

Sqlite 常用函数 推荐

andriodstudio利用listview和数据库实现简单学生管理

Sqlite expert pro5.0如何安装可视化数据库管理软件激活教程

navicat premium 15 永久破解激活工具及安装教程(亲测可用)

Sqlite中重置自动编号列的方法

android之采用execsql与rawquery方法完成数据的添删改查操作详解

cc++qt数据库sqlrelationaltable关联表详解

c#操作Sqlite数据库方法小结(创建,连接,插入,查询,删除等)

更多相关阅读请进入《Sqlite》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...