Django 外键使用详解,表关系之一对多,一对一,多对多实例详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33867131/article/details/82591821

1、app1/models.py文件:

from django.db import models


class Category(models.Model):
    name = models.CharField(max_length=100)
    flag = models.CharField(max_length=100)


class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    category = models.ForeignKey("Category", on_delete=models.CASCADE, null=True)
    # 引用另一个APP的model表:APP.表名
    author = models.ForeignKey("website.FrontUser", on_delete=models.CASCADE, null=True)


class Tag(models.Model):
    name = models.CharField(max_length=100)
    articles = models.ManyToManyField("Article")


class Comment(models.Model):
    content = models.TextField()
    # 这两种写法是等价的,自己做自己的外键
    # origin_comment = models.ForeignKey("self", on_delete=models.CASCADE)
    origin_comment = models.ForeignKey("Comment", on_delete=models.CASCADE)

2、app2/models.py文件:

from django.db import models

# Create your models here.

class FrontUser(models.Model):
    username = models.CharField(max_length=200)
    # 加上这个函数,print()打印的时候就能看到结果值
    def __str__(self):
        return "<FrontUser:(id:%s,username:%s)>" % (self.id, self.username)

class UserExtension(models.Model):
    school = models.CharField(max_length=200)
    user = models.OneToOneField("FrontUser", on_delete=models.CASCADE)

    def __str__(self):
        return "<UserExtension:(id:%s,school:%s,user_id:%s)>" % (self.id, self.school, self.user_id)

3、app1/views.py文件:

from django.http import HttpResponse
from .models import Category, Article, Tag
from app2.models import FrontUser, UserExtension


def ForeignKey_view(request):
    # 因为一开始数据库没数据,所以先给Category表加一条数据
    category = Category(name='最新文章')
    category.save()
    # 添加一条数据
    article = Article(title='钢铁是怎样炼成的', content='一个人的一生应该是这样度过的:当他回首往事的时候')
    # 1、直接对象操作,把分类加到文章表里
    article.category = category
    # 2、保存数据
    article.save()

    # 从数据库里取数据
    article = Article.objects.first()

    print(article.title)            # 自己表里的字段
    print(article.content)
    print(article.category.name)    # 可以取关联表里的字段
    print(article.category.flag)

    return HttpResponse("SUCCESS")

def delete_view(request):
    category = Category.objects.get(pk=3)
    category.delete()
    return HttpResponse("delete success")

def one_to_many_view(request):
    article = Article(title='夜车', content='车停了好几次 烟抽了好几根 这样的小城市 我不会来几次')
    category = Category.objects.first()
    author = FrontUser.objects.first()

    article.category = category
    article.author = author

    article.save()

    # 获取某个分类下的所有文章
    category = Category.objects.first()
    # 这样就能拿到这个分类下的所有文章
    re = category.article_set.all()

    # 在某一类下添加新文章
    # 方法一:
    # 因为一开始数据库没数据,所以先给Category表加一条数据
    category = Category(name='最新文章')
    category.save()
    # 添加一条数据
    article = Article(title='钢铁是怎样炼成的', content='一个人的一生应该是这样度过的:当他回首往事的时候')
    # 1、直接对象操作,把分类加到文章表里
    article.category = category
    # 2、保存数据
    article.save()

    # 方法二:(虽然这样也能存,但是这样太绕,直接用第一种方法)
    category = Category.objects.first()
    article = Article(title='夜车', content='这样的小城市 我不会来几次')
    article.author = FrontUser.objects.first()
    article.save()
    category.article_set.add(article)
    category.save()

    return HttpResponse("success")


def one_to_one_view(request):
    # 存一条数据
    user = FrontUser.objects.first()
    extension = UserExtension(school='wocalei')
    extension.user = user
    extension.save()

    # 查询用户信息,正查与反查
    # 由扩展表去点出用户表的信息
    extension = UserExtension.objects.first()
    print(extension.user)
    # 由用户表去点出扩展表的信息
    user = FrontUser.objects.first()
    print(user.userextension)

    return HttpResponse("成功")


def many_to_many_view(request):
    # 因为刚开始数据库里没有数据,所以要先保存几条数据
    article = Article.objects.first()
    tag = Tag(name='热门文章')
    tag.save()
    article.tag_set.add(tag)

    # 给id=1的Tag加一条数据
    tag = Tag.objects.get(pk=1)
    article = Article.objects.get(pk=1)
    tag.articles.add(article)

    # 查看一下id=1的文章,所有标签
    article = Article.objects.get(pk=1)
    tags = article.tag_set.all()
    for tag in tags:
        print(tag)

    return HttpResponse("成功")

4、关联模型查询

文章分类表:
class Category(models.Model):
    name = models.CharField(max_length=100)
    flag = models.CharField(max_length=100)

文章表:
class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    category = models.ForeignKey("Category", on_delete=models.CASCADE, null=True)

查找id为1,2,3的文章的分类:
    categories = Category.objects.filter(article__id__in=[1, 2, 3])

(1)反向查询是将模型名字小写化,比如:article__id,可以通过related_query_name来指定自己的方式,而不使用默认的方式

(2)反向引用是将模型名字小写化,然后再加上 _set,比如article_set,可以使用related_name来指定自己的方式,而不使用默认的方式

猜你喜欢

转载自blog.csdn.net/qq_33867131/article/details/82591821