Django - 从实例访问模型“通过”表上的字段

tsa*_*tor 6 python django many-to-many

我与直通表有多对多关系,如下所示:

class Chapter(models.Model):
    name = models.CharField(max_length=255,)
    slides = models.ManyToManyField('Slide', blank=True, related_name='chapters', through='SlideOrder')
    # ...

class Slide(models.Model):
    title = models.CharField(max_length=255,)
    # ...

class SlideOrder(models.Model):
    chapter = models.ForeignKey(Chapter)
    slide = models.ForeignKey(Slide)
    number = models.PositiveIntegerField()
Run Code Online (Sandbox Code Playgroud)

我可以按如下顺序获取一章的幻灯片:

chapter = Chapter.objects.get(pk=1)
chapter_slides = chapter.slides.order_by('slideorder')
Run Code Online (Sandbox Code Playgroud)

但是,在处理单个幻灯片实例时,我无法访问幻灯片顺序:

slide = Slide.objects.get(pk=1)
Run Code Online (Sandbox Code Playgroud)

如果我在幻灯片实例上执行以下操作,我可以看到所有可能的字段:

print slide._meta.get_all_field_names()
['title', u'chapters', 'slideorder', u'id']
Run Code Online (Sandbox Code Playgroud)

但是,尝试访问该slideorder字段给了我以下信息:

slide.slideorder
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'Slide' object has no attribute 'slideorder'
Run Code Online (Sandbox Code Playgroud)

我能够访问列出的所有属性,除了slideorder. 如何访问幻灯片的顺序?

Ala*_*air 6

您可以SlideOrder直接过滤模型

slide = Slide.objects.get(pk=1)
slide_orders = SlideOrder.objects.filter(slide=slide)
for slide_order in slide_orders:
    print slide_order.number
Run Code Online (Sandbox Code Playgroud)

或向后跟随外键:

slide = Slide.objects.get(pk=1)
slide_orders = slide.slideorder_set.all()
for slide_order in slide_orders:
    print slide_order.number
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅有关多对多关系的额外字段的文档。