【问题标题】:Many to Many and Foreign Key relations in django admindjango admin中的多对多和外键关系
【发布时间】:2015-04-16 20:07:11
【问题描述】:

首先我的 django 知识是初学者水平,所以请耐心等待。 我面临着我不知道如何处理的模范关系。我有 3 个模型:项目、位置和子位置。

一个项目可以有多个位置,每个位置可以有多个子位置。我在 Project 模型中有一个多对多的位置字段,在 Sublocation 模型中有一个用于位置的外键字段。

class Project(models.Model):
    ...
    locations = models.ManyToManyField(Location)

class Location(models.Model):
    name = models.CharField(max_length=250, unique=True)

class SubLocation(models.Model):
    location = models.ForeignKey(Location)
    name = models.CharField(max_length=100, unique=True)

在 django admin 中,我可以在创建项目时添加多个位置(使用 filter_horizo​​ntal)。但是,我还需要根据为正在创建的项目添加的位置来选择子位置的选项。我不知道如何使用上述方法。

然后我从项目模型中删除了多对多字段的位置,并尝试了以下方法。

我创建了一个 ProjectLocation 模型并将其作为内联添加到 Project ModelAdmin 中,以便能够在创建项目时添加位置和子位置。模型如下所示:

class ProjectLocation(models.Model):
    project = models.ForeignKey(Project)
    location = models.ManyToManyField(Location)
    sublocations = models.ManyToManyField(SubLocation)

但是,该方法无法按预期工作,因为您可以添加任何子位置,而不管添加的位置如何。我希望能够在创建项目时添加位置及其相关子位置。

我通读了泛型关系作为另一种可能的方法,但我仍然不知道如何实现它。

  1. 以我的模型结构,这可能吗?
  2. 如果为真,我应该怎么做才能得到想要的结果?
  3. 如果为 False,请建议我如何更改它。

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

    我认为如果您使用外键,您的情况会更容易,并且与 django 的 _set 选项一起使用会很容易。

    【讨论】:

      【解决方案2】:
      1. 是的,这是可能的,但它不会是动态的(这意味着更改位置的值不会在不先保存更改的情况下神奇地更新自身),这可能非常不切实际。
      2. 您应该在管理员中使用 formfield_for_manytomany -> https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_manytomany
      3. 实现此功能的最简单方法是在该特定管理表单上添加自定义 javascript 过滤

      【讨论】:

        【解决方案3】:

        保留模型并尝试在管理页面中使用 inlines

        所以,你的 admins.py 看起来像这样:

        class SubLocationInline(admin.StackedInline):
            model = SubLocation
        
        @admin.register(Location)
        class LocationAdmin(admin.ModelAdmin):
            .....   
            inlines = [SubLocationInline]
        

        【讨论】:

          猜你喜欢
          • 2012-10-20
          • 1970-01-01
          • 1970-01-01
          • 2012-07-22
          • 2011-08-07
          • 1970-01-01
          • 2021-08-28
          • 2016-12-30
          • 2020-06-07
          相关资源
          最近更新 更多