gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:57:09 27 4
gpt4 key购买 nike

我正在尝试创建一个处理以下内容的 Django 模型:

  • Item可以有几个Name s。
  • Name其中之一s 代表 Item是它的主要 Name ,即 Name显示给定 Item .

  • (为了保护无辜者而更改了模型名称。)
    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需要是 Name 之一正在编辑的项目的 s?
  • 有没有办法自动设置primaryName到第一 Name找到,如果 primaryName未设置,因为我使用的是内联管理员名称?

  • 编辑:当,我忘了这仍然是开放的。无论如何,我最终重做模型,替换 primaryNameCharField 中只有名称 (a Item)和重命名 NameAlias .这不能做我想做的事(只需在一张表中搜索名称),但我无法制作 primaryName如果没有 null=True , 自 Item在任何 Name 之前被保存s 已创建,这意味着任何尝试自动分配 Name会看到一个空的 QuerySet并失败。

    我能看到它工作的唯一方法是让 Name的保存例程自动设置为其父级的 primaryName如果 primaryNameNULL ,这对我来说不太合适。

    最佳答案

    • How do I explain to the admin that primaryName needs to be one of the Names of the item being edited?


    退房 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)

    关于django - 在 Django 中设置多对一的首选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2430360/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com