代码之家  ›  专栏  ›  技术社区  ›  Mike DeSimone

在Django中设置多对一的首选项

  •  2
  • Mike DeSimone  · 技术社区  · 15 年前

    我试图创建一个django模型来处理以下内容:

    • Item 可以有几个 Name S.
    • 其中之一 名字 为了一个 项目 是它的主要 名字 ,即 名字 显示给定的 项目 .

    (为了保护无辜者,模特的名字被改了。)

    这个 models.py 我看起来像:

    class Item(models.Model):
        primaryName = models.OneToOneField("Name", verbose_name="Primary Name", 
            related_name="_unused")
        def __unicode__(self):
            return self.primaryName.name
    
    class Name(models.Model):
        item = models.ForeignKey(Item)
        name = models.CharField(max_length=32, unique=True)
        def __unicode__(self):
            return self.name
    

    类元: 排序=['名称']

    这个 admin.py 看起来像:

    class NameInline(admin.TabularInline):
        model = Name
    
    class ItemAdmin(admin.ModelAdmin):
        inlines = [ NameInline ]
    
    admin.site.register(Item, ItemAdmin)
    

    看起来数据库模式运行良好,但是我在管理方面遇到了问题,所以目前我对任何事情都不确定。我的主要问题是:

    • 我该怎么向管理员解释 primaryName 需要成为 名字 正在编辑的项目的?
    • 有自动设置的方法吗 原始名字 到第一 名字 发现如果 原始名字 没有设置,因为我对名称使用内联管理?

    编辑:该死,我忘了这个还开着。不管怎样,我最后重新做了模型,替换了 原始名字 只有一个名字 CharField 项目 重命名 名字 Alias . 这不能做我想做的事(只是在一张表中搜索一个名字),但是我不能 原始名字 如果没有工作 null=True ,因为 项目 在任何 名字 创建了,这意味着任何自动分配 名字 会看到一个空的 QuerySet 失败了。

    我能看到它工作的唯一方法就是 名字 的保存例程自动将自身设置为其父级 原始名字 如果 原始名字 NULL ,这让我很不舒服。

    3 回复  |  直到 14 年前
        1
  •  1
  •   istruble kalyan    15 年前
    • 我该如何向管理员解释primaryname必须是 正在编辑的项的名称?

    退房 formfield_for_foreignkey() ModelAdmin docs .

    class ItemAdmin(admin.ModelAdmin):
        def formfield_for_foreignkey(self, db_field, request, **kwargs):
            if db_field.name == "primaryName":
                # tweak the filter to your liking.
                kwargs["queryset"] = Name.objects.filter(item=...)
                return db_field.formfield(**kwargs)
            return super(ItemAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
    
        2
  •  2
  •   Brandon Henry    15 年前

    我想你想看看这里。

    http://docs.djangoproject.com/en/dev/ref/contrib/admin/#adding-custom-validation-to-the-admin

    定义自己的表单以处理可能需要的任何自定义验证。

        3
  •  0
  •   Wogan    15 年前
    • 有没有办法自动将primaryname设置为找到的名字, 如果没有设置primaryname,因为我 对名称使用内联管理?

    你可以在你的模特身上做这个 save 方法,类似于:

    class Item(models.Model):
        ...(snip)...
        def save(self,force_insert=False,force_update=False):
            if self.primaryName is None:
                self.primaryName = self.name_set.all()[0]
                # will want to handle the case that no names are set, etc
            super(Item,self).save(force_insert,force_update)