【问题标题】:Django - designing models with virtual fields?Django - 使用虚拟字段设计模型?
【发布时间】:2010-10-10 02:35:05
【问题描述】:

我想问一下在Django中设计具有虚拟字段的模型时最优雅的方法......

假设我们正在建立一个在线商店,系统中的所有产品都由模型“Product”定义。

class Product(models.Model):
    # common fields that all products share
    name = ...
    brand = ...
    price = ...    

但是商店会有很多完全不相关的产品类型,所以我需要一些方法来存储不同产品类型的虚拟字段(即 MP3 播放器的容量,一本书的页数,..)。

到目前为止,我可以用我的原始 Django 技能提出的解决方案远非完美:

  • 具有“custom_fields”属性 和中间表,我 手动管理。 (尖叫着难听 我的脸:))

  • 或继承自 “产品”与 Python 的 危险的 exec-eval 语句(这也是 用于维护的许多巫术魔法 并且实施将 需要了解 Django 内部知识)。

您对此有何看法?

TIA。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    继承遗产。使用自己的附加字段创建 Produce 子类。

    【讨论】:

      【解决方案2】:

      就个人而言,我会选择 S. Lott 的回答。但是,您可能想要创建一个自定义 JSON 字段:

      http://svn.navi.cx/misc/trunk/djblets/djblets/util/fields.py

      http://www.djangosnippets.org/snippets/377/

      【讨论】:

        【解决方案3】:

        产品有特点。

        class Feature( models.Model ):
            feature_name = models.CharField( max_length=128 )
            feature_value = models.TextField()
            part_of = models.ForeignKey( Product )
        

        这样。

        只是功能列表。

        p= Product( "iPhone", "Apple", 350 )
        p.save()
        f= Feature( "mp3 capacity", "16Gb", p )
        f.save()
        

        如果需要,您可以在单独的表格中提供功能名称的主列表。不要过度分析特征。您不能对它们进行任何处理。你所做的就是呈现它们。

        【讨论】:

        • 具有公共字段的抽象模型也是处理此问题的有用方法。
        【解决方案4】:

        Ruby on Rails 有一个“序列化”字段,允许您将字典打包到文本字段中。也许 DJango 提供了类似的东西?

        This article 有一个 SerializedDataField 的实现。

        【讨论】:

          猜你喜欢
          • 2019-01-07
          • 1970-01-01
          • 1970-01-01
          • 2016-10-12
          • 2015-12-21
          • 1970-01-01
          • 2019-02-04
          • 1970-01-01
          • 2010-09-30
          相关资源
          最近更新 更多