【问题标题】:check related object or not检查相关对象与否
【发布时间】:2018-09-20 10:55:02
【问题描述】:

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

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

有关系

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):

【问题讨论】:

  • 请先修正属性名称:ForeignKeys 应该_id 后缀。现在这将引入像item_variation_id_id 这样的属性。

标签: python django postgresql django-models


【解决方案1】:

注意ForeignKey 命名法):ForeignKeys 应该有一个_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,我们避免加载相关对象,从而潜在地进行额外的数据库查询。

【讨论】:

  • 你为什么用my_这个后缀?
  • @M4STER:my_itemvariationvalueItemVariationObject,而且是前缀 :)
  • 不清楚你能说清楚我有没有声明 my_itemvariationvalue ?
  • @M4STER:在您的问题中,您写“我有两个对象 ItemVariationValue 和 ItemVariation”,如果这些对象被命名为 my_intemvariationvaluemy_itemvariation,那么它会诡计。不知何故,您需要引用您的对象。
  • 但上述内容没有多大意义,因为ItemVariation 可以有零个、一个或更多 ItemVariationValues。 ForeignKey 毕竟是多对一的关系。此外,经过几次编辑后,您仍然无法清楚地说明问题。你究竟做什么,而不是如何你想做什么?
【解决方案2】:

据我所知,您有一个 ItemVariationValue 对象,并且您想知道该对象是否有 ItemVariation。这样你就可以轻松做到了

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

check_relation_obj=itemvariation.item_variation

如果您认为您可能与 ItemVariation 有关系,也可能没有关系 用外键添加空白=True,null=True。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-19
    • 2015-03-01
    • 2020-07-09
    • 2016-01-15
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多