如何在django中设置多对多的多对多关系

时间:2015-12-15 06:33:53

标签: python django django-models

在过去的七天里,我正在尝试使用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. 一个标签可以有很多帖子,帖子可以有很多标签
  4. 但我上面创建的模型并没有像我预期的那样工作(我很困惑)。

    当我把作者字段放在Post Class中,这样我会成为一个关系,作者可以有很多帖子,但我得到错误作者没有定义。(因为我知道解释器运行代码从顶部到底部)。我该如何完成

3 个答案:

答案 0 :(得分:1)

您有两种选择:

  1. 更改作者和帖子位置,因此Page可以看到帖子定义。
  2. 使用Lazy来电:author= models.ForeignKey("Author")
  3. 通过这种方式,Django将等到所有模型加载然后解析依赖关系。

答案 1 :(得分:0)

尝试模型结构语法:

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.)作者可以有很多帖子,因为我将Post Model设置为一对多字段
2.)类别可以有很多帖子,反之亦然(这已根据你的代码设置)
3.)标签可以有很多帖子,反之亦然(非常类似于你已经制作的类别模型,我在两者之间创建了多对多的字段)
 

您收到错误的原因是因为您让作者根据您的模型结构发布了多对一关系(一个帖子中的许多作者)的关系

现在测试它只需迁移所有这些更改并在管理页面中快速测试

答案 2 :(得分:0)

  
      
  1. 作者可以有很多帖子,帖子只能有单个作者
  2.   

Post模型应该ForeignKey指向Author

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

Post模型应该ManyToManyField指向Category

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

与数字2相同。