Django:ForeignKey、多对一

2018-06-29  本文已影响0人  MandaJC

Article

ForeignKey和ManyToManyField

class User(models.Model):
    SEX_CHOICE = (('M','male'), ('F','female'),)
    username = models.CharField('用户名',primary_key=True, max_length=30)
    password = models.CharField('密码',max_length=30)
    sex = models.CharField('性别',max_length=10,choices=SEX_CHOICE)

class Article(models.Model):
    content = models.TextField(null=True, blank=True)
    user = models.ForeignKey(User,on_delete=models.CASCADE, related_name='article')

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='comment')
    article = models.ManyToManyField(Article, related_name='comment')
    content = models.TextField()

ForeignKey(多对一)

使用:

#创建含ForeignKey对象:
user = User.objects.get(username="mandajc666")  #get使用时最好用try?到时候查查ifairy2
article = Article.objects.create(user=user, content="test") 

ForeignKey在插入数据时要将外键属性作为属性之一,如user

#以下是创建后数据库的结果:
id  content user_id
7   test    mandajc666
#以下是相关操作
article.user    #获取关联用户对象
Out[7]: <User: User object (mandajc666)>
article.user.pk #获取关联用户对象的属性值
Out[10]: 'mandajc666'

ManyToManyField(多对多)

使用:

#创建含ManyToManyField对象:
article = Article.objects.create(user=user, content="test") 
comment = Comment.objects.create(user=user,content="testtest")
article.comment.add(comment)    #或comment.article.add(article)

ManyToManyField在插入数据时不能将该属性作为声明属性之一,因为数据表中根本没有这一列,django是在数据库中新建一个表“模块名_comment_article”来替代这一列,所以article.comment.add(...)的comment是models中定义的related_name(反向),同理,comment.article.add(...)的article就是Comment中的属性值article

#以下是创建后article_comment_article的结果:
id  comment_id  article_id
2   2   7
#以下是相关操作
article.comment.filter(user_id="mandajc666")    #正常增删改查,和前面外键article.user一样,获取的是对象,然后通过.访问它们的属性值
Out[18]: <QuerySet [<Comment: Comment object (2)>]>
comment.article.filter(user_id="mandajc666")    #反向查询
Out[19]: <QuerySet [<Article: Article object (7)>]>

待测试:count

上一篇 下一篇

猜你喜欢

热点阅读