簡體   English   中英

Django管理中的多對多和外鍵關系

[英]Many to Many and Foreign Key relations in django admin

首先,我的django知識是初學者,所以請耐心等待。 我面臨着一個我不知道該如何處理的模型關系。 我有3個模型:Project,Location和SubLocation。

一個項目可以有多個位置,每個位置可以有許多子位置。 我在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管理員中,我能夠在創建項目時添加多個位置(使用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. 如果為False,請推薦如何更改它。

我認為,如果您使用外鍵,這將使您的情況變得更容易,並且可以與django的_set選項一起使用。

  1. 是的,這是可能的,但它不是動態的(這意味着更改位置值不會先神奇地更新自己,而無需先保存更改),這可能非常不切實際。
  2. 您應在管理員中使用formfield_for_manytomany-> https://docs.djangoproject.com/zh-CN/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_manytomany
  3. 實現此目的的最簡單方法是在該特定管理表單上添加自定義javascript過濾

保留原樣,並嘗試在管理頁面中使用內

因此,您的admins.py看起來像這樣:

class SubLocationInline(admin.StackedInline):
    model = SubLocation

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM