【问题标题】:Transient use of Django Model instancesDjango 模型实例的瞬态使用
【发布时间】:2017-01-21 19:14:36
【问题描述】:

我有一个用例,其中特定类可以是瞬态的或持久的。瞬态实例是从 PUT 调用上的 JSON 有效负载构建的,可以持久保存到数据库中,也可以在服务器调用期间使用,然后返回或丢弃。这种情况下的最佳做法是什么?我的选择似乎是:

  • 编写两个类,其中一个是models.Model子类,另一个不是,并让它们实现相同的API,或者
  • 使用 Model 子类,但注意不要调用 save()。

根据 Django 模型的传统用法,这两种方法中的哪一种更可取?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    为了尽可能保持DRY,你可以有一个抽象的模拟类来派生你的模型:

    class A(models.Model):
        # fields'n'stuff
    
    class TransientA(A):
        def save(*args, **kwargs):
            pass  # avoid exceptions if called
    
        class Meta:
            abstract = True  # no table created
    

    现在,即使您在任何地方调用save(即使在从A 继承的方法中),您也将是空白。

    【讨论】:

      【解决方案2】:

      两个都需要:

      abstract = True 在继承者仍然应该是具体模型的情况下很有用,因此不应仅为父类创建表。它允许您选择退出 multi-table inheritance,而是将共享属性复制到继承表 (abstract base inheritance)。

      managed = False 在继承类根本不应该被持久化的情况下很有用。 Django 迁移和固定不会为此生成任何数据库表。

      class TransientModel(models.Model):
          """Inherit from this class to use django constructors and serialization but no database management"""
          def save(*args, **kwargs):
              pass  # avoid exceptions if called
      
          class Meta:
              abstract = True  # no table for this class
              managed = False  # no database management
      
      class Brutto(TransientModel):
          """This is not persisted. No table app_brutto"""
          #do more things here
          pass
      

      【讨论】:

        猜你喜欢
        • 2018-06-25
        • 1970-01-01
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多