zoukankan      html  css  js  c++  java
  • Django:model中的ForeignKey理解

    有两个数据模型栏目模型和文章模型ArticleColumn和ArticlePost

    ArticleColumn:

    class ArticleColumn(models.Model):
        # 用户与栏目是“一对多”关系,所以用ForeignKey,一个用户可以设置多个栏目,此处的user字段对应实际表中的user_id,来自于User表中主键
        user = models.ForeignKey(User, related_name='article_column')
        column = models.CharField(max_length=100)
        created = models.DateTimeField(auto_now_add=True)

    ArticlePost:

    class ArticlePost(models.Model):
    
        author = models.ForeignKey(User, related_name='article')
        title = models.CharField(max_length=200)
        slug = models.SlugField(max_length=500)
        column = models.ForeignKey(ArticleColumn, related_name='article_column')
        body = models.TextField()
        created = models.DateTimeField(default=timezone.now())
        updated = models.DateTimeField(auto_now_add=True)
        # media/%Y%m%d/为图片的真实放置路径,因为settings中已经配置了MEDIA_ROOT为media文件夹,blank=True允许表单的该字段对应值为空,意思是非必填字段
        avatar = models.ImageField(upload_to='%Y%m%d/', blank=True)

    可以看到在ArticlePost模型中有一个字段为column,且类型为ForeignKey,意思是外键,代表的是“多对一”的关系,第一个参数ArticleColumn是对应的模型名称,related_name为反查时的关联名称。

    多对一指的是,多个文章可以对应一个栏目,比如有10篇文章都是属于django栏目的(当然一个文章也可以对应多个栏目,这样就是多对多关系了:ManyToManyField,此处我们设计不存在这种情况),

    有了外键关系后,那如何去查询某篇文章对应的所属栏目呢?

    article = ArticlePost.objects.get(id=150)
    
    article.column

     如果不使用外键关系,想查询某篇文章对应的所属栏目呢?

    # 获取该文章对象
    article = ArticlePost.objects.get(id=150)
    # 找到该文章对象对应的column_id,column_id这一列就是因为ArticlePost模型中有column字段且将ArticleColumn作为外键,所以将ArticleColumn模型对应表中的主键id的值作为column_id的值,将列名命名为column_id
    article.column_id
    # 根据上面查出来的id找到该栏目对象
    column = ArticleColumn.objects.get(id=article.column_id)
    # 输出栏目名称
    column.column

    那怎么反查某个栏目下有多少文章呢?

    # 查询出叫django的栏目
    column = ArticleColumn.objects.get(column='django')
    # 通过column这个实例.article_column.all(),查询出该栏目下的所有文章,article_column就是在ArticlePost模型中的related_name的值
    column.article_column.all()
    # 反查django这个栏目下title中包含'list'字符串的文章
    column.article_column.filter(title__contains='list')
  • 相关阅读:
    对各种语言的运行时系统的思考
    在Ipython console运行shell命令
    浪潮之巅第四版
    Python实现BSC信道
    一款超赞的英文翻译工具-CopyTranslator
    Python处理alist文件——稀疏矩阵的读取和存储
    Numpy/Scipy 中与Matlab中的sparse函数等效的操作——Python处理稀疏矩阵
    简单优先分析法
    蓝桥杯 矩阵乘法
    蓝桥杯 Island Hopping Java代码
  • 原文地址:https://www.cnblogs.com/gcgc/p/10775210.html
Copyright © 2011-2022 走看看