为什么get get_queryset()没有返回正确的结果?

时间:2013-04-10 20:39:32

标签: django django-views

我有两个模型,Recieved_orderorder

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()做错了什么。

2 个答案:

答案 0 :(得分:2)

这里有一些令人困惑的事情:

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

您告诉它构建一个针对Order个对象过滤User个对象的查询。

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

答案 1 :(得分: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个下划线)来访问关系,而不是_.