【问题标题】:Django one-to-many relationship on single model单个模型上的 Django 一对多关系
【发布时间】:2015-05-26 19:35:41
【问题描述】:

我正在尝试获取带有部分的 django 模型。每个部分可以有一个或没有超级部分,每个部分可以有许多子部分。这是我的模型

class Section(models.Model):
    section_name = models.CharField(max_length=100)
    sub_sections = models.ForeignKey('self', related_name='super_section', null=True)
    links = models.ForeignKey('Link')

    def __str__(self):
        return self.section_name

class Link(models.Model):
    link_adress = models.URLField(max_length=2083)
    link_text = models.CharField(max_length=50)
    link_description = models.CharField

    def __str__(self):
        return self.link_text

这里的问题是试图让管理面板按我想要的方式工作。在管理面板中,我希望能够查看和编辑子部分,并且(这是我的问题)希望能够编辑我当前部分所在的超级部分。

【问题讨论】:

标签: python django django-admin


【解决方案1】:

您的ModelClass Section 是错误的。现在Section 对象只能有一个子部分。 您应该将 sub_sections 属性替换为:

super_section = models.ForeignKey('self', related_name='sub_sections', null=True)

这样做Section 对象可能有许多子部分,但最多有一个超部分。

有关ForeignKey 在 Django 中如何工作的更多信息,请查看docs

现在进入管理部分:

您可以修改管理面板以将Section 对象的相关对象(即超级部分和子部分)显示为内联(TabularInlineStackedInline)。有关 Django 中可用的 Inline 类的更多信息,请查看 docs

内联示例代码:

from django.contrib import admin
from yourapp.models import Section

class SectionInline(admin.TabularInline):
    model = Section

class SectionAdmin(admin.ModelAdmin):
    inlines = [
        SectionInline,
    ]

【讨论】:

  • 我尝试过内联,但没有提供我正在寻找的内容。添加部分时,我希望能够输入名称,选择父部分并在需要时添加子部分。我希望能够在单个管理页面中执行此操作
【解决方案2】:

你的模型错了。如果我理解正确,这就是你想要的:

           Super-section
                |
             Section
          ______|______
         |      |      |
        Sub    Sub    Sub

你的模型应该是这样的:

class SuperSection(models.Model):
    # define your fields here
    # it doesn't need to have a ``ForeignKey``

class Section(...):
    super_section = models.ForeignKey(SuperSection)
    # define other fields
    # doesn't need any more ``ForeignKey``

class SubSection(...):
    section = models.ForeignKey(Section) 
    # define other keys

【讨论】:

  • 这不是我想要的,因为我将被限制在总共 3 个级别。如果需要,我希望能够有 n 个级别。
猜你喜欢
  • 2012-12-04
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 2018-01-04
  • 2014-05-16
  • 1970-01-01
相关资源
最近更新 更多