django - 从 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 文档,但是对嵌套字段的支持并不多。关于这个主题的一些简单的解释会很棒!
解决方案
.values() 是一种查询集方法,但是由于您正在迭代 qs 并使用每个单独的项目,因此您不需要它。如果你有和 Item 你应该是苹果来访问 fk 关系
你有没有尝试过:
order['producer'] = item.itemId.producerID