0

我有两个模型,Recieved_order并且order

class Order(SmartModel):

    restaurant = models.ForeignKey(Restaurant,null=True,blank=True,default = None,help_text="The restaurant the customer order from")
    #contact info
    email = models.EmailField(max_length=50,help_text="Needed as alternative")
    mobile = PhoneNumberField(max_length=20,default='+25078######')

class Recieved_Order(SmartModel):
    item = models.ForeignKey(Item)
    date_added = models.DateTimeField(auto_now=True,auto_now_add=True)
    quantity = models.IntegerField(default=0)
    price = models.DecimalField(max_digits=9,decimal_places=2)
    order = models.ForeignKey(Order)

我想要一个餐厅经理(用户),能够Recieved_order在登录时接收到他的特定餐厅的订单(),为了实现这一点,我在views.py中有以下内容

class Recieved_OrderCRUDL(SmartCRUDL):
    model = Recieved_Order
    actions = ('create','read','update','delete','list')
    permissions = True

    class List(SmartListView):
        fields = ('order_email','order_mobile','order_billing_city','item.name','item.price','quantity','order_id','order_restaurant')
        search_fields = ('date_added',)

        def get_queryset(self,*args,**kwargs):
            queryset = super(Recieved_OrderCRUDL.List, self).get_queryset(*args,**kwargs)
            if self.request.user.is_superuser:
                return queryset
            return queryset.filter(order=self.request.user) 

有了以上内容,我正在两个不同的餐厅进行测试,这家餐厅和它没有按应有的方式工作。它返回给定餐厅的错误订单。

我做错了什么get_queryset()

4

2 回答 2

2

这里发生了一些令人困惑的事情:

return queryset.filter(order=self.request.user) 

您要告诉它构建一个查询,Order根据对象过滤User对象。

您的示例代码中是否缺少将订单与用户联系起来以便可以构建正确连接的内容?

于 2013-04-10T21:46:52.207 回答
1

如果你想让一个用户(你称之为经理)只能查看他们自己的订单,你需要改变一些事情......Restaurant需要有一个指向 a 的字段User(让我们称之为user并假设它是ForeignKey) 然后你可以做类似的事情

if self.request.user.is_superuser:
    return queryset
return queryset.filter(order__restaurant__user=self.request.user) 

正如@Joe Holloway 指出的那样,您不应该尝试order使用对象过滤字段user......

我想指出的另一件奇怪的事情是

fields = ('order_email','order_mobile','order_billing_city','item.name','item.price','quantity','order_id','order_restaurant')

您似乎正在使用多种方式来尝试访问事物......您应该使用__(即 2 个下划线)来访问关系,而不是_.

于 2013-04-10T22:32:02.057 回答