从 Django 中的 Queryset 访问嵌套字段
Accessing nested field from Queryset in Django
所以我有 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 的视图,它处理所有购物车项目以便创建如下订单
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 你应该是 apple 访问 fk 关系
你试过了吗:
order['producer'] = item.itemId.producerID
所以我有 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 的视图,它处理所有购物车项目以便创建如下订单
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 你应该是 apple 访问 fk 关系
你试过了吗:
order['producer'] = item.itemId.producerID