Django模型继承与vi中的子类型转换

2024-10-01 02:37:37 发布

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

这是一种cms类型的应用程序

我有一个文章模型和一些专业模型.py在

class Article(models.Model):
    foo = models.CharField(max_length=50)
    bar = models.CharField(max_length=100,blank=True)
    DISPLAY_CHOICES = (
        ('N', 'None'),
        ('C','Carousel'),
        ('M','Marketing'),
        ('F','Featurette')
    ) 
    display = models.CharField(max_length=1, choices = DISPLAY_CHOICES)

def __unicode__(self):
    return self.title

class Artist(Article):
    website = models.URLField(max_length=200,blank=True)

class Venue(Article):
    location = models.CharField(max_length=150)
    map_link = models.URLField(max_length=200,blank=True)

class Event(Article):
    time = models.DateTimeField()
    venue = models.ForeignKey(Venue)
    performers = models.ManyToManyField(Artist)

我想根据物品展示但是当我打电话给你的时候

^{pr2}$

我仍然需要子类的额外属性,所以我写了

#views.py
def castToSubClass(article):
    try:
        return Artist.objects.get(article_ptr_id = article.id)
    except:
        try:
            return Event.objects.get(article_ptr_id = article.id)
        except:
            try:
                return Venue.objects.get(article_ptr_id = article.id)
            except:
                return article


def index(request):
    carousel = [castToSubClass(article) for article in Article.objects.filter(display='C']
    marketing = [castToSubClass(article) for article in Article.objects.filter(display='M'[:3]]
    featurettes = [castToSubClass(article) for article in Article.objects.filter(display='F']
    return render_to_response('frontpage.html',
    {
    'carousel': carousel,
    'marketing':marketing,
    'featurettes': featurettes
    })

为了在适当的子类对象中转换它们,除了看起来笨拙之外,这似乎意味着我要为查询集中的每个(或几乎每个)项访问数据库两次。在

有没有办法在最初打给经理的电话中做到这一点?在

谢谢。在


Tags: idtruereturnobjectsmodelsdefdisplayarticle
1条回答
网友
1楼 · 发布于 2024-10-01 02:37:37

使用一个模型存储所有内容,并添加一个字段来区分文章类型,这样您就可以使用模板中的display为每种类型呈现不同的外观(如tumblr do)。在

class Article(models.Model):
    foo = models.CharField(max_length=50)
    bar = models.CharField(max_length=100,blank=True)
    DISPLAY_CHOICES = (
        ('N', 'None'),
        ('C','Carousel'),
        ('M','Marketing'),
        ('F','Featurette')
    ) 
    display = models.CharField(max_length=1, choices = DISPLAY_CHOICES)
    ARTICLE_TYPE_CHOICES = (
        ('artist', 'Artist'),
        ('venue', 'Venue'),
        ('event', 'Event'),
    )
    type = models.CharField(max_length=32, choices = ARTICLE_TYPE_CHOICES)
    website = models.URLField(max_length=200,blank=True, null=True)
    location = models.CharField(max_length=150, blank=True, null=True)
    map_link = models.URLField(max_length=200,blank=True, null=True)
    time = models.DateTimeField(null=True)
    venue = models.ForeignKey('self', null=True)
    performers = models.ManyToManyField('self', null=True)


def __unicode__(self):
    return self.title


#views.py
def index(request):
    carousel = Article.objects.filter(display='C')
    marketing = Article.objects.filter(display='M')
    featurettes = Article.objects.filter(display='F')
    return render_to_response('frontpage.html',{'carousel': carousel, 'marketing':marketing, 'featurettes': featurettes})

相关问题 更多 >