如何使用pymodm跨多个模型共享字段

2024-10-02 00:32:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用pymodm来创建模型,以尽可能保持代码的干性,但我真的不知道如何使用pymodm

Django能够使用abstract=True逻辑地构造模型,以帮助保持代码的干性:

# Django
class TimeStampedModel(models.Model):
   created = models.DateTimeField(auto_now_add=True)

   class Meta:
       abstract = True

# Both these models will have a `created`
# field and will create a new instance of each 
# model class while being separate tables in the database
class Model1(TimeStampedModel):
   pass

class Model2(TimeStampedModel):
   pass

但是,同样的使用pymodm的方式并没有像我期望的那样工作:

# pymodm
class TimeStampedModel(MongoModel):
    created = fields.DateTimeField(default=datetime.now)

# Both these models will have a `created` field and will 
# create a new instance of each model class but, 
# crucially, use the same collection in the database
# (which I don't want)
class Model1(TimeStampedModel):
    pass

class Model2(TimeStampedModel):
    pass

ThisJIRA ticket建议他们不想在pymodm中实现abstract,这对我来说很好——只是我不太明白如何在使用该ticket中建议的mixin时以干巴巴的方式构造代码

目前我最接近的方法是:

# pymodm

class TimeStampedModel(MongoModel):
    created = fields.DateTimeField(default=datetime.now)

class Model1(TimeStampedModel):
    class Meta:
        collection_name = 'model_1'
        final = True

class Model2(TimeStampedModel):
    class Meta:
        collection_name = 'model_2'
        final = True

即手动定义Meta上的collection_name。但这有几个问题-首先,我觉得有点难看(但那可能就是我!)。第二,这并不禁止任何人做TimeStampedModel.objects.create()和仅仅创建一个文档(只能通过继承实现)

有没有更好的方法来处理这个问题呢

我想要的是能够做Model1.objects.create(),并为它创建一个名为model_1的集合。如果我这样做Model2.objects.create(),我期望一个名为model_2的集合

当前执行Model1.objects.create()创建了一个名为time_stamped_model的集合,我假设这是因为pymodm处理模型继承的方式非常详细here


Tags: truemodelobjectsmodelscreatepasswillmeta

热门问题