【问题标题】:Tastypie overriding obj_createTastypie 重写 obj_create
【发布时间】:2014-12-17 07:14:50
【问题描述】:

我有以下资源,我正在尝试覆盖 obj_create。如果我不覆盖它,一切都会完美运行,但是当我覆盖它时,它会出现 POST 错误。有什么线索吗?真的很感激一个答案,虽然我相信这些天美味派真的没有得到任何关于堆栈溢出的答案..这很烦人。我正在考虑可能出于同样的原因切换我的堆栈..

代码如下:

class OrderResource(BackBoneCompatibleResource):
  person = fields.ToOneField(PersonResource, 'person', full=True)
  restaurant = fields.ToOneField(RestaurantResource, 'restaurant', full=True)
  itemList = fields.ToManyField(OrderItemResource, 'itemList', full=True)

  class Meta:
    object_class = Order
    queryset = Order.objects.all().order_by("-time_updated")
    resource_name = 'order'
    allowed_methods = ['get','post','put','delete','patch']
    authorization = Authorization()
    serializer = Serializer(formats=['json', 'jsonp', 'xml', 'yaml', 'html', 'plist'])
    authentication = ClientAuthentication()
    authorization = OrderAuthorization()
    always_return_data = True
    filtering = {
        "restaurant" : ["exact"],
        "time_created" : ["gte"],
        "person" : ["exact"]
    }

  def obj_create(self, bundle, request=None, **kwargs):
    print "Entered Order Create"
    return super(OrderResource, self).obj_create(bundle, request, **kwargs)

订单模型是:

class Order(models.Model):
  restaurant = models.ForeignKey(Restaurant)
  person = models.ForeignKey(Person)
  tableNumber = models.CharField(max_length=2)
  PLACED = 'p'
  ACCEPTED = 'a'
  READY = 'r'
  ORDER_STATUS_CHOICES = (
    (PLACED, 'Placed'),
    (ACCEPTED, 'Accepted'),
    (READY, 'Ready'),
  ) 
  order_status = models.CharField(max_length=1, choices=ORDER_STATUS_CHOICES, default=PLACED)
  itemList = models.ManyToManyField(OrderItem, null=True)
  tax = models.FloatField()
  tip = models.FloatField()
  cost = models.FloatField()
  time_created = models.DateTimeField(auto_now_add=True)
  time_updated = models.DateTimeField(auto_now=True)

正如我所说,如果我从资源中删除 obj_create() 函数,则 post 会正常进行。通过编写文档中指定的默认函数,我无法理解我在做什么错?我可能遗漏了一些非常明显的东西。谢谢你的时间..

我得到的具体错误如下,但不确定它是否有很大帮助..

<type 'exceptions.TypeError'>, TypeError('obj_create() takes exactly 2 arguments (3 given)',), <traceback object at 0x10d30fb90>

【问题讨论】:

  • 错误是什么?发布完整的回溯。
  • 我收到以下错误,我不知道这是多么具体或有帮助.. (&lt;type 'exceptions.TypeError'&gt;, TypeError('obj_create() takes exactly 2 arguments (3 given)',), &lt;traceback object at 0x10e33f368&gt;)
  • 有人吗?我一直在为此苦苦挣扎,这似乎是一个小问题..

标签: python django tastypie


【解决方案1】:

改变这一行:

return super(OrderResource, self).obj_create(bundle, request, **kwargs)

到这里:

return super(OrderResource, self).obj_create(bundle, request=request, **kwargs)

requestmust be passed as a keyword argument.

【讨论】:

    【解决方案2】:

    当您调用super().obj_create 时,您正在向父方法传递一个它不期望的参数。错误消息告诉您出了什么问题,当您查看documentation 中的父方法时,它是有道理的。它捕获了**kwargs,但看看怎么没有*args?这意味着它无法处理您传递给它的request 参数。

    Resource.obj_create(self, bundle, **kwargs)  # Tastypie 
    

    我建议您使用相同的方法签名在您的子类上定义obj_create,这样您就不会混淆调用者的期望。父母没有明确处理request,所以你也不应该。最终代码:

    class OrderResource(BackBoneCompatibleResource):
        def obj_create(self, bundle, **kwargs):
            print "Entered Order Create"
            return super(OrderResource, self).obj_create(bundle, **kwargs)
    

    【讨论】:

    • 感谢 Kevin 和 Jcotton。这很有帮助。不知何故,我为 obj_create() 找到的所有早期资源,他们指定了 3 个参数,stackoverflow.com/questions/10070173/… 但是,谢谢,我现在明白了很多!!
    • 看起来请求参数在 v0.9.12 中消失了。不要忘记为有用的答案投票=)
    • 谢谢@JCotton。是的,我投了赞成票。我之前试图勾选两个,因为两者都有帮助,但不幸的是堆栈溢出只允许 1 个勾选标记!顺便说一句,你能帮我解决这个问题吗? .. 我经常很难获得有关堆栈溢出的 Tastypie 问题的回复,而且 Tastypie 的开发工作已经有一段时间有点慢了.. 你个人会建议我切换到 Django-rest-framework 还是使用 Flask/Bottle ,或者任何其他更可靠的推荐,或者美味的馅饼就足够了?
    • 好问题。 Django Rest 框架当然有很大的动力。如果我开始一个新项目,我会使用它。对于两个相当大的过去项目,我使用 Tastypie 没有问题。我喜欢 Tastypie,但它已经放慢了速度,而且还没有达到 1.0,它现在真的应该是这样。如果您在 Tastypie 上投入了大量资金,只要它满足您的需求,我认为没有必要切换。如果开始新事物或需要其他功能,DRF 是首选考虑。
    • 感谢 JCotton。我真的很重视这个建议。是的,我现在已经在 Tastypie 上投入了很多!但一旦我能找到更多资源,我会保持开放态度(到 DRF)!
    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2015-06-23
    • 1970-01-01
    相关资源
    最近更新 更多