簡體   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