是否检查相关对象

时间:2018-09-20 10:55:03

标签: python django postgresql django-models

我需要检查与我的对象相关的ORM postgresql /

我需要检查两个对象ItemVariationValue和ItemVariation ItemVariationValue ItemVariation

相关

models.py

class ItemVariation(models.Model):
    item=models.ForeignKey(Item,on_delete=models.CASCADE)
    price=models.IntegerField(blank=True,null=True,default=0)
    item_code=models.CharField(max_length=500)
    keywords= models.ManyToManyField(Keyword)
    image=models.ImageField(upload_to='dishes/', blank=True, null=True)
    def __str__(self):
        return str(self.id)

class ItemVariationValue(models.Model):
    item=models.ForeignKey(Item,on_delete=models.CASCADE)
    item_variation=models.ForeignKey(ItemVariation,on_delete=models.CASCADE)
    attribute=models.ForeignKey(Attribute,on_delete=models.CASCADE)
    attribute_value=models.ForeignKey(AttributeValue,on_delete=models.CASCADE)
    def __str__(self):
        return str(self.id)

views.py

def get_items(request):    # request= {"order_details": "varxxx:1"}
    order=request.data['order_details']
    items = order.split(',')
    total = 0
    for item in items:
        od = item.split(':')
        sku = str(od[0])
        qty = int(od[1])
        itemvariation=ItemVariation.objects.get(item_code=sku)



# if ItemVariationValue.item_variation has ForeignKey(ItemVariation):

2 个答案:

答案 0 :(得分:1)

  

注意ForeignKey命名法):ForeignKey应该 后缀为_id,因为Django会自动构造一个包含主键的额外字段fieldname_id。通过编写一个_id后缀,您将引入诸如item_variation_id_id之类的额外属性。尽管严格来说这不是问题,但它引起了很多混乱。例如my_itemvariationvalue.itemvariation_id将产生一个ItemVariation对象,等等。

如果您固定了ForeignKey名称,则可以像这样进行检查:

# given the ForeignKey is named itemvariation, not itemvariation_id and use Comparison Operators 

if my_itemvariationvalue.itemvariation_id == my_itemvariation.id:
    # ... (objects are related)
else:
    # ... (otherwise)

通过在此处使用itemvariation_id,我们避免加载相关对象,因此有可能进行额外的数据库查询。

答案 1 :(得分:0)

据我所知,您有一个ItemVariationValue对象,并且您想知道此对象是否具有ItemVariation。这样您就可以轻松完成

#your code
itemvariation=ItemVariation.objects.get(item_code=sku)

check_relation_obj=itemvariation.item_variation

如果您认为自己可能与ItemVariation有关系, 添加带有外键的blank = True,null = True。