article = Article(title='夜车', content='车停了好几次 烟抽了好几根 这样的小城市 我不会来几次')
author = User.objects.filter(username='xioahua')
article.author = author
article.save()
用filter(),save时报错:"<QuerySet [<User: xioahua>]>": "Article.author" must be a "User" instance.
换用get()就不会报错了
article.author = User.objects.first()
article.author = User.objects.get(username="admin")
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来指定自己的方式,而不使用默认的方式