如何在Django中创建一种DB View(没有任何db表的派生模型)

时间:2015-08-01 05:42:31

标签: django python-3.x model

这是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个显示Storys元素的类:

  • 只有bf类型的一个型号
  • ...只有cm类型的
  • ...以及仅dl类型的最后一个

我希望所有数据都存储在Story数据库表中,但需要处理不同的模型。我怎么能这样做?

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您需要做的事情似乎是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]