【问题标题】:How to setup many to many one to many and many to one relationship in django如何在django中设置多对多一对多和多对一关系
【发布时间】:2015-12-15 06:33:52
【问题描述】:

从过去 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

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

Relation 我想设置的是

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

但是我上面创建的模型并没有像我预期的那样工作(我很困惑)。

当我将作者字段放在 Post Class 中时,这样我就会像这样的关系,一个作者可以有很多帖子,但是我得到了错误 Author is not defined.(因为我知道解释器从顶部运行代码到底部)。我该如何完成

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    你有两个选择:

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

    这样,Django 会等到所有模型加载完毕后再解析依赖。

    【讨论】:

    • Lazy 的最佳做法不是 Ali Nikneshan 我会坚持使用懒惰的电话
    • 我也是,让更多的解耦。
    【解决方案2】:

    试试模型结构语法:

    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.) 标签可以有很多帖子,反之亦然(与您已经制作的类别模型非常相似,我在两者之间制作了多对多字段)

    你得到错误的原因是因为你让你的作者根据你的模型结构发布与多对一(一篇文章中的许多作者)的关系

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

    【讨论】:

    • 尝试解释为什么这个解决方案可以解决问题。我们在这里帮助人们了解原因,而不仅仅是解决问题
    • 很多帖子可以有一个作者或作者可以有很多帖子是什么意思
    • 请评价我们的答案以换取一些声誉,谢谢:)
    【解决方案3】:
    1. 作者可以有多个帖子,一个帖子只能有一个作者

    Post 模型应该有一个 ForeignKey 指向 Author

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

    Post 模型应该有一个 ManyToManyField 指向 Category

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

    与第 2 个相同。

    【讨论】:

    • class Post(...): category = models.ManyToManyField('Category') 不是ManytoManyField
    • @kemumaki 哦,是的!谢谢,
    • 好的,Ali Nikneshan 已经指出了原因,所以我将接受他的回答,但您的回答也帮助我理解了我将支持的问题
    猜你喜欢
    • 2015-07-05
    • 2011-08-29
    • 2019-08-04
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多