繁体   English   中英

如何在Django中建立多对多一对多和多对一关系

[英]How to setup many to many one to many and many to one relationship in django

从最近的7天开始,我尝试使用django构建博客,并弄清楚了博客的模型,如下所示

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    created_at = models.DateTimeField('created date', auto_now_add=True, auto_now=False)
    updated_at = models.DateTimeField('updated date', auto_now_add=False, auto_now=True)

    def __str__(self):
        return self.title


class Author(models.Model):
    name = models.CharField(max_length=150)
    email = models.EmailField(blank=True)
    bio = models.TextField()
    #This line define many author can have a post
    #but I want manypost can only have single author.
    #in my view to accomplish this i need to define author in Post class
    #on defining author=ForeignKey(Author) in post, It throws  an error Author is not defined
    post = models.ForeignKey(Post) 

    def __str__(self):
        return self.author

class Category(models.Model):
    cat_name = models.CharField(max_length=200)
    post = models.ManyToManyField(Post)

    def __str__(self):
        return self.cat_name

我非常困惑的是帖子,类别,作者和标签之间的关系。

关系我想设置的是

  1. 作者可以有多个帖子,一个帖子只能有一个作者
  2. 类别可以有多个帖子,一个帖子可以有多个类别
  3. 一个标签可以有很多标签一个帖子可以有很多标签

但是我上面创建的模型不能按我预期的那样工作(我很困惑)。

当我将author字段放在Post Class中时,这样我就可以成为一个关系,一个author可以有很多职位,但是我得到的错误是Author未定义。(因为我知道解释器从上到下运行代码)。 我该如何完成

您有两种选择:

  1. 更改作者和帖子位置,因此Page可以看到帖子定义。
  2. 使用惰性调用作为: author= models.ForeignKey("Author")

这样,Django将等到所有模型加载后再解决依赖关系。

尝试模型结构语法:

class Author(models.Model):
    name = models.CharField(max_length=150)
    email = models.EmailField(blank=True)
    bio = models.TextField()

    def __str__(self):
        return self.author

class Post(models.Model):
    author = models.ForeignKey(Author)
    title = models.CharField(max_length=200)
    body = models.TextField()
    created_at = models.DateTimeField('created date', auto_now_add=True, auto_now=False)
    updated_at = models.DateTimeField('updated date', auto_now_add=False, auto_now=True)

    def __str__(self):
        return self.title

class Category(models.Model):
    cat_name = models.CharField(max_length=200)
    post = models.ManyToManyField(Post)

    def __str__(self):
        return self.cat_name

class Tag(models.Model):
    tag_name = models.CharField(max_length=200)
    post = models.ManyToManyField(Post)

    def __str__(self):
        return self.tag_name

这将解决您的三个要求:
1.)作者可以有很多帖子,因为我将“帖子模型”设置为“一对多”字段
2.)类别可以有很多帖子,反之亦然(已经根据您的代码设置了)
3.)标签可以有很多帖子,反之亦然(非常类似于您已经创建的“类别模型”,我在这两个字段之间建立了多对多字段)

出现错误的原因是因为您使您的作者根据模型结构发布了多对一关系(许多作者在一篇文章中)

现在对其进行测试,只需迁移所有这些更改并在管理页面中对其进行快速测试

  1. 作者可以有多个帖子,一个帖子只能有一个作者

Post模型应具有指向AuthorForeignKey

class Post(...):
    author = models.ForeignKey('Author')
  1. 类别可以有多个帖子,一个帖子可以有多个类别

Post模型应具有指向CategoryManyToManyField

class Post(...):
    category = models.ManyToManyField('Category')
  1. 一个标签可以有很多标签一个帖子可以有很多标签

与数字2相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM