【问题标题】:Different Field types of model class模型类的不同字段类型
【发布时间】:2020-09-16 23:02:29
【问题描述】:

我试图为用户提供在 SomeModel 中存储任意数量或种类的 ExtraParameters 列表的可能性(它可能很小,如 IntegerField、BooleanField 或相当大,如 TextField)。

我尝试实现 ExtraParameter abstract 模型类,它会将 ForeignKey 保留给 SomeModel,它的子类也只有一个参数,例如:

class ExtraParameter(models.Model):
    somemodel = models.ForeignKey(SomeModel, ...)

    class Meta:
        abstract = True

class IntegerExtraParameter(ExtraParameter):
    value = models.IntegerField()

我相信它需要多个像这样的小类,因此可以迁移到不同字段的多个数据库表。

我说的对吗?请提供更好的解决方案。也许其他方式来装饰 ExtraParameter 是可能的?

这种方法的问题是在实现模板时,通过 somemodel.extraparameters.all() 获取所有类型的存储参数并不容易,而是 我需要显式调用每个子类并构建从它设置。但我也看到了一个解决方案,可以在应用程序的配置中找到任何类的所有子类,所以它会有所帮助。

雅库布

【问题讨论】:

    标签: django database django-models


    【解决方案1】:

    我认为您正在寻找的答案在这里得到了深入的介绍:
    https://stackoverflow.com/a/7934577/

    我个人喜欢 Django 和 JsonField 一起工作的方式。
    https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.JSONField
    JsonField 将为您提供动态元数据的巨大灵活性。

    在此示例中,我只是将 JsonField 附加到那些需要动态元数据的模型。然后extra_information 可以保存与父模型相关的值类型的数据。

    class ExtraInformationModel(models.Model):
        # Abstract model that adds json field for additional meta data
    
        extra_information = JSONField()
    
        class Meta:
            abstract = True
    
    
    class SomeModel(ExtraInformationModel):
        # extra_information field comes from the abstract model
        
        ...usual model stuff..
    

    使用 JsonFields 进行查询就像使用 Django orm 通常一样简单。
    https://docs.djangoproject.com/en/3.1/topics/db/queries/#querying-jsonfield

    (来自 Django 文档的示例)

       Dog.objects.create(name='Rufus', data={
           'breed': 'labrador',
           'owner': {
               'name': 'Bob',
               'other_pets': [{
                   'name': 'Fishy',
               }],
           },
       })
       Dog.objects.create(name='Meg', data={'breed': 'collie', 'owner': None})
       Dog.objects.filter(data__breed='collie')
    

    【讨论】:

      猜你喜欢
      • 2015-05-03
      • 1970-01-01
      • 2022-01-27
      • 2015-03-25
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多