【问题标题】:Accessing nested field from Queryset in Django从 Django 中的 Queryset 访问嵌套字段
【发布时间】:2021-09-15 06:23:25
【问题描述】:

所以我有 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)
   ......

然后我有一个 post-only 视图,它处理所有购物车项目,以便按如下方式创建订单

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 文档,但对嵌套字段的支持并不多。对该主题进行一些简单的解释会很棒!

【问题讨论】:

    标签: django django-rest-framework backend rest


    【解决方案1】:

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

    你试过了吗:

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

    【讨论】:

    • 哇,很简单。我发誓我先尝试过,但出现语法错误,我可能太累了。不过谢谢!这正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2015-08-06
    • 2016-01-20
    相关资源
    最近更新 更多