Django ForeignKey在继承的模型上设置

neo*_*ser 7 python django django-models

我有两个型号CategoryEntry.还有另一种ExtEntry继承的模型Entry

class Category(models.Model):
    title = models.CharField('title', max_length=255)
    description = models.TextField('description', blank=True)
    ...

class Entry(models.Model):
    title = models.CharField('title', max_length=255)    
    categories = models.ManyToManyField(Category)
    ...

class ExtEntry(Entry):    
    groups= models.CharField('title', max_length=255)
    value= models.CharField('title', max_length=255)
    ...
Run Code Online (Sandbox Code Playgroud)

我可以使用Category.entry_set但我希望能够做到,Category.blogentry_set但它不可用.如果这不可用,那么我需要另一种方法来使所有ExtEntry与一个特定相关Category

编辑我的最终目标是拥有一个ExtEntry对象的QuerySet

谢谢

Ski*_*Ski 4

我需要另一种方法来获取与一个特定类别相关的所有 ExtEntry

简单的:

ExtEntry.objects.filter(categories=my_category)
Run Code Online (Sandbox Code Playgroud)

你知道是否有办法使用继承的 _set 功能

我不知道他们是否有直接的。文档中没有提到它。

但用 可以得到类似的结果select_related

for e in category.entry_set.select_related('extentry'):
    e.extentry # already loaded because of `select_related`, 
               # however might be None if there is no Extentry for current e
Run Code Online (Sandbox Code Playgroud)

可以仅选择具有 ExtEntry 的条目:

for e in category.entry_set.select_related('extentry').exlude(extentry=None):
    e.extentry # now this definitely is something, not None
Run Code Online (Sandbox Code Playgroud)

排除的坏处是它会生成极其低效的查询:

SELECT entry.*, extentry.* FROM entry
LEFT OUTER JOIN `extentry` ON (entry.id = extentry.entry_ptr_id) 
WHERE NOT (entry.id IN (SELECT U0.id FROM entry U0 LEFT OUTER JOIN 
                        extentry U1 ON (U0.id = U1.entry_ptr_id) 
                        WHERE U1.entry_ptr_id IS NULL))
Run Code Online (Sandbox Code Playgroud)

所以我的简历是:用来ExtEntry.objects.filter()获取结果。向后关系(object.something_set)只是一种方便,并不适用于所有情况。