Django管理员filter_horizontal设置为编辑多对多关系提供了一个很好的小部件.但这是一个特殊的设置,需要一个字段列表,所以它只能在(admin for the)模型中定义ManyToManyField; 如何在(其他模型的管理员)上获取相同的小部件,向后阅读关系?
我的模型看起来像这样(可以随意忽略User/ UserProfile复杂化;但它是真正的用例):
class Site(models.Model):
pass
class UserProfile(models.Model):
user = models.OneToOneField(to=User,unique=True)
sites = models.ManyToManyField(Site,blank=True)
Run Code Online (Sandbox Code Playgroud)
我可以在管理表单上获得一个不错的小部件UserProfile与
filter_horizontal = ('sites',)
Run Code Online (Sandbox Code Playgroud)
但无法看到如何获得Site管理员的等价物.
我也可以通过添加内联来获得部分SiteAdmin,定义为:
class SiteAccessInline(admin_module.TabularInline):
model = UserProfile.sites.through
Run Code Online (Sandbox Code Playgroud)
虽然这是迂回而且不方便; 对于简单地管理多对多关系,小部件根本不直观.
最后,这里描述的一个技巧涉及定义另一个ManyToManyFieldon Site并确保它指向同一个数据库表(并跳过一些箍,因为Django实际上并不是设计为在描述相同数据的不同模型上具有不同的字段).我希望有人能告诉我更清洁的东西.
我有一个遗留数据库,其中一个表存储多对多关系,但没有一个主键列.有没有办法说服Django使用它呢?
示意图:
Product 1<---->* Labeling *<---->1 Label
Run Code Online (Sandbox Code Playgroud)
该Labeling表(product_id,label_id)用作复合主键,我没有看到任何方式通知Django这个.(只是使用through给我Unknown column 'labeling.id' in 'field list'.)
我是否需要回退到自定义SQL?或者我错过了什么?
由于复杂的原因,我发现自己在违背以下原则Codable:在解码 json 对象时,我想将子对象保留在extra“just as json”键下,存储为[String: Any]字典,但[String: Any](当然)不是Decodable。有什么办法可以做到这一点吗?
第一个答案当然是“不”。我的回答是“我需要”:我需要对数据进行两次 Codable传递,其中第一次解码异构对象列表(每个对象都有一个 key name),而第二次传递使用以这些值为键的字典name,并且是正确类型安全的。第一遍不能是类型安全的,因为它在异构列表上操作,但它需要保留第二遍将使用的所有数据。值得庆幸的是,所有异构数据都隐藏在该extra密钥下,但我仍然不知道该怎么做。
(很可能会有一个关于编码相同内容的后续问题,所以如果您碰巧有洞察力,请随时提及。)