【问题标题】:Django-TastyPie reverse indirect foreign keyDjango-TastyPie 反向间接外键
【发布时间】:2013-12-30 21:52:52
【问题描述】:

我的 Django 应用中有以下模型,其中 OrderCart 相关,cartItem 相关>购物车产品。现在在我的tastepie api中,当我获得订单时,我还想获得与订单购物车相关的所有产品。

class Order(models.Model):
     objects = OrderManager()    
     order_number = models.CharField(max_length=20, editable=False,unique=True,   
                                default=get_unique_order_number)
     user = models.ForeignKey(User, blank=True, null=True)
     cart = models.ForeignKey(Cart, blank=True, null=True)  
     ...


class Cart(models.Model):
     user = models.ForeignKey(User)
     is_check_out = models.BooleanField(default=False)
     ...

class CartItem(models.Model):
     objects = CartItemManager()
     cart = models.ForeignKey(Cart)
     product = models.ForeignKey(Product)
     ...

class CartRelatedResource(ModelResource):
    class Meta:
    queryset = Cart.objects.all()
    allowed_methods = ['get'] 
    excludes = ['is_check_out', 'session', 'creation_date', 'modification_date']
    include_resource_uri = False       
    authentication = SessionAuthentication()

class OrderResource(ModelResource):
    cart = fields.ForeignKey(CartRelatedResource, 'cart',full=True)

    class Meta:
       queryset = Order.objects.all()
       resource_name = 'order'
       fields = ['cart_id','delivery_time','shipping_address_id','billing_address_id',
       'tip','phone','delivery_instructions']
       include_resource_uri = False
       allowed_methods = ['post','get']
       authentication = SessionAuthentication()
       authorization = OrderAuthorization()

我不认为在这种情况下使用 ToManyField 会起作用。会吗?实现我想要的最好方法是什么?

【问题讨论】:

  • 也许在CartRelatedResource 中,您可以定义这样的字段:orders = fields.ToManyField(OrderResource, 'cart__order_set', related_name='cart') 我不是一个好吃的家伙,所以不确定它是否会起作用..
  • @mariodev 这不起作用,因为 OrderResource 在 CartRelatedResource 之后
  • 然后尝试使用带有完整路径的字符串表示法。
  • @mariodev 我得到 {"error": "模型 '' 有一个空属性 'order_set' 并且不允许一个空值。"}

标签: django tastypie


【解决方案1】:

我想我已经解决了。如您所知,products 字段是最重要的部分:

class ProductRelatedResource(ModelResource):
    class Meta:
        queryset = Product.objects.all()
        fields = ['id', 'name']
        include_resource_uri = False


class OrderResource(ModelResource):
    products = fields.ToManyField(ProductRelatedResource,
        attribute=lambda bundle: Product.objects.filter(cartitem__cart=bundle.obj.cart), full=True)

    class Meta:
        queryset = Order.objects.all()
        resource_name = 'order'
        include_resource_uri = False

【讨论】:

    猜你喜欢
    • 2014-09-19
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多