django admin中的多对多和外键关系

时间:2015-04-16 10:09:37

标签: python django django-models django-admin

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

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

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. 如果为True,我该怎么做才能得到理想的结果?
  3. 如果错,请建议我如何更改它。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

保留模型,并尝试在管理页面中使用内联

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

class SubLocationInline(admin.StackedInline):
    model = SubLocation

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