【问题标题】:Django TastyPie Patch to a Many-to-Many多对多的 Django TastyPie 补丁
【发布时间】:2014-02-15 10:51:39
【问题描述】:

我正在尝试将 TastyPie Patch 用于多对多,但出现此错误:

"error_message": "Tastypie 需要 Python 风格的路径 () 来延迟加载相关资源。仅给定 'SchemeResource'。",

为什么?

我正在制作的补丁:

/participant/84
POST: {"email":"test@test.com",  "schemes":{"id":"12", "schemes"}}

资源:

class ParticipantResource(ModelResource):

    schemes = fields.ToManyField('SchemeResource', attribute='schemes', full=True, null=True)

    class Meta:
        queryset = Participant.objects.all()
        resource_name = 'participant'
        allowed_methods = ['post', 'get', 'put', 'patch']

第二资源:

class SchemeResource(ModelResource):

    user = fields.ToOneField(UserResource, 'user', full=True)
    link = fields.ToOneField(SchemeLinkResource, 'link', full=True)

    class Meta:
        queryset = Scheme.objects.all()
        resource_name = 'scheme'

型号:

class Participant(models.Model):

    email = models.EmailField(unique=True)
    mobile = PhoneNumberField(null=True, blank=True)
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    schemes = models.ManyToManyField(Scheme)

【问题讨论】:

    标签: python django tastypie


    【解决方案1】:

    您必须使用括号,例如

    [] 
    

    发布到 m2m 字段时,围绕您的方案项目(即使是单数)。

    然后请求看起来像:

    {"email":"test@test.com",  "schemes":[{"id":"12", "schemes"}]}
    

    当您想知道请求应该是什么样子时,请在 url/of/api/modelresource/schema/ 上发出 GET 请求

    如果我没记错的话(尽管你在请求中写了“POST”),PATCH 请求必须有

    {"objects": [...]}
    

    包围身体。

    编辑:

    这是一个对我有用的例子:

    资源:

    class VATCertificateResource(ModelResource):
        class Meta:
            queryset = VATCertificate.objects.all()
            resource_name = 'vatcertificate'
            authorization = Authorization()
    
    class InterventionResource(ModelResource):
    
        vatcertificates = fields.ToManyField('core.api.VATCertificateResource', 'vatcertificates',
                                         related_name='intervention', null=True, blank=True, full=True)
    

    型号:

    class VATCertificate(Document):
        intervention = models.ForeignKey(Intervention, related_name='vatcertificates', blank=True, null=True)
    
    class Intervention(models.Model):
        pass
    

    希望对你有帮助,

    问候,

    【讨论】:

    • 您好 Ambroise,感谢您的回复,不幸的是,我在括号中也遇到了同样的错误。
    • 我已经编辑了我的答案,也许它会给你一些关于如何解决你的问题的想法......使用它和相同的请求格式,我设法修补资源及其 m2m 对象.祝你好运!
    • 我试一试,我刚刚注意到您在您的 VATCertificate 模型中使用了 ForeignKey,请注意 ManyToManyField,这样的多对多如何工作?
    • 我在 admin 中将其显示为内联,无论如何都会创建反向关系字段。
    猜你喜欢
    • 2012-07-01
    • 1970-01-01
    • 2013-04-06
    • 2017-09-09
    • 1970-01-01
    • 2023-04-03
    • 2012-02-11
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多