gpt4 book ai didi

python - Django:通过类似字典的接口(interface)访问表

转载 作者:太空宇宙 更新时间:2023-11-03 16:04:42 24 4
gpt4 key购买 nike

所以我在 Django 中遇到这样的情况,我有一个名为 S 的模型,它可以有一系列属性,但我目前不知道哪些属性是相关的/需要的。为了解决这个问题,我正在考虑创建一个附加模型 SAttrib,它模仿字典条目并通过元数据属性访问它。见下文。

class S(models.Model):                                                                                                                                               
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=128, blank=True, null=True)
description = models.CharField(max_length=128, blank=True, null=True)
created_date = models.DateTimeField(auto_now_add=True, auto_now=False)
modified_date = models.DateTimeField(auto_now_add=False, auto_now=True)
def __unicode__(self):
return smart_unicode(self.name)
class Meta:
db_table = "stest"
def _get_metadata(self):
class AD(dict):
def __init__(self, id):
self.id = id
def __getitem__(self, key):
return SampleAttrib.objects.filter(sample_id=self.id, attrib_key=key).get().attrib_value

return AD(self.id)

metadata = property(_get_metadata)

class SampleAttrib(models.Model):
s_id = models.ForeignKey("S")
attrib_key = models.CharField(max_length=128)
attrib_value = models.TextField()
class Meta:
db_table = 's_attrib'
unique_together = (('s_id', 'attrib_key'),)

我想通过将 SAttrib 实现为属性来访问存储在 SAttrib 中的属性。所以我可以像这样访问值:

y = S.objects.get()
y.metadata["foo"]

但随后它就变得一团糟,需要大量额外的代码来设置和保存对象/包含等。

s = S.objects.get()
s.metadata["foo"] = "spam"

.....

是否有更好的方法来构建这个或 Django 中已有但我缺少的东西?

欢迎所有建议......

谢谢

最佳答案

这个想法并没有太大错误,除了您似乎通过使用 _get_metadata 函数使其变得不必要的复杂化。您可能也因此遇到了一些性能问题。

当您事先不知道将在表中存储哪种类型的名称/值对时,这种双表方法在许多网络应用程序中非常流行。然而,由于 nosql 解决方案和大多数 RDBMS 现在支持 JSON 数据类型,这种做法现在正在减少。

Django 内置了对 Postgresql 出色的 JSONB 字段的支持。对于其他数据库,可以使用经过尝试和测试的 JSONFields,因此使用 JSONFields 将为您提供一个非常好的独立于数据库的解决方案。

关于python - Django:通过类似字典的接口(interface)访问表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39958907/

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