【问题标题】:Django - Access fields on a model's "through" table from an instanceDjango - 从实例访问模型“通过”表上的字段
【发布时间】:2015-07-07 15:14:19
【问题描述】:

我与这样的直通表存在多对多关系:

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()

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

chapter = Chapter.objects.get(pk=1)
chapter_slides = chapter.slides.order_by('slideorder')

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

slide = Slide.objects.get(pk=1)

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

print slide._meta.get_all_field_names()
['title', u'chapters', 'slideorder', u'id']

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

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

我可以访问除slideorder 之外的所有属性。如何访问幻灯片的顺序?

【问题讨论】:

    标签: python django many-to-many


    【解决方案1】:

    您可以直接过滤SlideOrder 模型

    slide = Slide.objects.get(pk=1)
    slide_orders = SlideOrder.objects.filter(slide=slide)
    for slide_order in slide_orders:
        print slide_order.number
    

    或向后跟随外键:

    slide = Slide.objects.get(pk=1)
    slide_orders = slide.slideorder_set.all()
    for slide_order in slide_orders:
        print slide_order.number
    

    有关更多信息,请参阅extra fields on many-to-many relationships 上的文档。

    【讨论】:

    • 那么获取特定幻灯片的幻灯片顺序的唯一方法是执行 3 次查询? chapter = Chapter.objects.get(pk=1), slide = Slide.objects.get(pk=1), slide_order = SlideOrder.objects.get(slide=slide, chapter=chapter), print slide_order.number
    • 根据您的操作,您应该可以使用select_related()prefetch_related。例如SlideOrder.objects.filter(slide=1, chapter=1).select_related('slide', 'chapter') 是一个查询。
    【解决方案2】:

    您可以使用slide.slideorder_set,如django docs 中所述

    【讨论】:

      猜你喜欢
      • 2014-07-19
      • 2014-02-09
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      相关资源
      最近更新 更多