【问题标题】:How to create sort of DB View in Django (derived models without any db table)如何在 Django 中创建某种数据库视图(没有任何数据库表的派生模型)
【发布时间】:2015-10-23 20:54:46
【问题描述】:

这是我在 models.py 中的 Story 类:

class Story(models.Model):
    def __str__(self):
        return self.content if len(self.content) <= 8 else self.content[:8]+"..."
    master = models.ForeignKey(User)
    story_book = models.ForeignKey(Story_book)
    content = models.CharField(max_length=5000)
    create_date = models.DateTimeField('date created')
    STORY_TYPES = (
        ('bf', 'before commited'),
        ('cm', 'commited'),
        ('dl', 'deleted'),
    )
    Story_type = models.CharField(max_length=2, choices=STORY_TYPES, default='bf')
    handled_date = models.DateTimeField('date handled', null=True)

我想做 3 个展示故事元素的类:

  • 只有bf 类型的一个模型
  • ... 一个只有cm 类型
  • ...最后一个只有dl类型

我希望将所有数据存储在Storydatabase 表中,但要处理不同的模型。我该怎么做?

我该怎么做?

【问题讨论】:

    标签: django python-3.x model


    【解决方案1】:

    您需要做的似乎是proxy models,带有自定义管理器:

    class Story(models.Model):
        """ Base model, will be represented in database """
        master = models.ForeignKey(User)
        [...]
        Story_type = models.CharField(max_length=2, choices=STORY_TYPES, default='bf')
    
    
    class StoryManager(models.Manager):
        """ Manager used for proxies, to automatically filter by type """
        def __init__(self, story_type=None, *args, **kwargs):
            super(StoryManager, self).__init__(*args, **kwargs)
            self.story_type = story_type
    
       def get_queryset(self):
            return super(StoryManager, self).get_queryset().filter(Story_type=self.story_type)
    
    
    class BeforeCommitedStory(Story):
        """ Each proxy take the custom manager with the revelant type """
        objects = StoryManager('bf')
        class Meta:
            proxy = True
    
    
    class CommitedStory(Story):
        objects = StoryManager('cm')
        class Meta:
            proxy = True
    
    
    class DeletedStory(Story):
        objects = StoryManager('dl')
        class Meta:
            proxy = True
    

    您应该获得以下行为:

    Story.objects.create(..., type="bf") # ID 1
    Story.objects.create(..., type="bf")  
    Story.objects.create(..., type="cm")
    Story.objects.create(..., type="dl")
    
    Story.objects.all() # [ID 1, ID 2, ID 3, ID 4]
    BeforeCommitedStory.objects.all() # [ID 1, ID 2]
    CommitedStory.objects.all() # [ID 3]
    DeletedStory.objects.all() # [ID 4]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 2011-01-15
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      相关资源
      最近更新 更多