Django - Access fields on a model's “through” table from an instance

亡梦爱人 提交于 2019-12-18 09:21:28

问题


I have a many-to-many relationship with a through table like so:

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

I am able to get the slides for a chapter in order like so:

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

However, when working on an individual slide instance I am unable to access the slide order:

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

If I do the following on my slide instance I can see all possible fields:

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

However trying to access the slideorder field gives me the following:

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

I am able to access all attributes listed except slideorder. How can I access a slide's order?


回答1:


You can either filter on the SlideOrder model directly

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

or follow the foreign key backwards:

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

See the docs on extra fields on many-to-many relationships for more info.




回答2:


You can use slide.slideorder_set as documented in the django docs



来源:https://stackoverflow.com/questions/31272632/django-access-fields-on-a-models-through-table-from-an-instance

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!