小编tsa*_*tor的帖子

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

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

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. 如何访问幻灯片的顺序?

python django many-to-many

6
推荐指数
1
解决办法
9416
查看次数

序列化程序 - 在 Django Rest Framework 3 中包含额外的上下文不起作用

该文件指出:

您可以通过context在实例化序列化程序时传递参数来提供任意附加上下文。

好的,让我们这样做:

serializer = AccountSerializer(account, context={'foo':'bar'})
Run Code Online (Sandbox Code Playgroud)

然后文档指出:

通过访问self.context属性,可以在任何序列化器字段逻辑中使用上下文字典。

好的,让我们这样做:

class AccountSerializer(serializers.ModelSerializer):

    custom_field = serializers.SerializerMethodField()

    class Meta:
        model = Account
        fields = ('id', 'name', 'custom_field')

    def get_custom_field(self, obj):
        print('Context:', self.context)
        foo = self.context.get('foo')
        print('Foo:', foo)
        ...
        return "custom data"
Run Code Online (Sandbox Code Playgroud)

这些打印语句导致:

Context: {'request': <rest_framework.request.Request object at 0x1127d3160>, 'format': None, 'view': <account.api.views.AccountView object at 0x1127c4f98>

Foo: None
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?无论上下文是什么,都不会使用所需的额外上下文进行修改。

django-rest-framework

2
推荐指数
1
解决办法
4042
查看次数