首页 > 解决方案 > 从 Django 中的 Queryset 访问嵌套字段

问题描述

所以我有4个模型

class User(models.Model):
   userID = models.CharField(pk = True)
   ......    

class Producer(models.Model):
   userID = models.OneToOneField('Users.User',on_delete=CASCADE,primary_key=True)
   .....

class Buyer(models.Model):
   userID = models.OneToOneField('Users.User',on_delete=CASCADE,primary_key=True)
   .....

class Inventory(models.Model):
   item_id = models.UUIDField(primary_key=True,auto_created=True,default=uuid.uuid4)
   producerID = models.ForeignKey('Producers.Producer',on_delete=CASCADE)
   .....

class Cart(models.Model):
    userID = models.OneToOneField(Buyer, on_delete = CASCADE,primary_key = True)
    last_updated = models.DateTimeField(auto_now = True) 

class Cart_Item(models.Model):
   cart_item_id = models.UUIDField(primary_key=True,auto_created=True,default= uuid.uuid4)
   item_id = models.ForeignKey('Inventory.Inventory', on_delete= SET_NULL,null=True)
   userID = models.ForeignKey(Cart,on_delete=CASCADE)
   ......

然后,我有一个仅发布视图,它处理所有购物车项目以创建订单,如下所示

class PlaceOrderView(generics.CreateAPIView):

     def post(self, request, *args, **kwargs):
         user = request.user
         cart = Cart_Item.objects.select_for_update().filter(userID = user).order_by('item_id__producerID')
         
         order = {'producer':'',
                  'items': []
                 }
         for item in cart:
             if order['producer'] == item.values('item_id.producerID'):
                 order['items'].append(item)
             else:
                 self.placeOrder(order)
                 order['producer'] = item.values('item_id.producerID')
                 order['items'] = []
                 order['items'].append(item)
     
     def placeOrder(self,order):

        with transaction.atomic():
           #Business logic on order.

我试图做的是按特定生产者拥有的物品对所有购物车物品进行分组,然后为该组购物车物品下订单。我遇到问题的地方是访问购物车项目的嵌套字段“producerID”,需要这样做才能对我的所有购物车项目进行分组。

我的 placeOrder 方法使用 cartItem 对象,因此它们直接在函数中传递。目前我在for循环中序列化购物车项目只是为了比较producerID,但这感觉效率低下。我已经阅读了有关字段主题的 django 文档,但是对嵌套字段的支持并不多。关于这个主题的一些简单的解释会很棒!

标签: djangodjango-rest-frameworkbackendrest

解决方案


.values() 是一种查询集方法,但是由于您正在迭代 qs 并使用每个单独的项目,因此您不需要它。如果你有和 Item 你应该是苹果来访问 fk 关系

你有没有尝试过:

order['producer'] = item.itemId.producerID

推荐阅读