这是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
数据库表中,但需要处理不同的模型。我怎么能这样做?
我该怎么做?
答案 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]