Python Django查询-编写查询的最佳方式
我有如下模型Python Django查询-编写查询的最佳方式,python,django,django-models,django-queryset,Python,Django,Django Models,Django Queryset,我有如下模型 class Shipment(models.Model): airwaybill_number = models.IntegerField(primary_key=True) origin = models.CharField(max_length=50) destination = models.CharField(max_length=50) class ShipmentHistory(Models.Model): airwaybill_num
class Shipment(models.Model):
airwaybill_number = models.IntegerField(primary_key=True)
origin = models.CharField(max_length=50)
destination = models.CharField(max_length=50)
class ShipmentHistory(Models.Model):
airwaybill_number = models.IntegerField(primary_key=True)
last_added_bag = models.CharField(max_length=50, null=True, blank=True)
...
some other fields which can be null
以下哪项是更新ShipmentHistory表中的行的最佳方法
使用try/except
try:
history = ShipmentHistory.objects.get(airwaybill_number=1000)
history.last_added_bag = 'abc'
# update other history fields
history.save()
except ShipmentHistory.DoesNotExist:
# create the history record and then update
使用查询过滤器
history = ShipmentHistory.objects.filter(airwaybill_number=1000)
if history.exists()
history[0].last_added_bag = 'abc'
# update other fields
history[0].save()
else:
# create history record first then update
特定装运的历史记录将至少更新十几次
我从未见过这样定义的django模型,我希望,这只是一个伪模型
Shipment:
airwaybill_number (pk)
origin (not null)
destination (not null)
您的两个查询都是两个不同的查询.get()
vs.filter()
。后者提供queryset,而.get()
提供一个对象
对于.get()。在您的案例中,get()
的问题是,如果有多个,您可能会得到。这就是为什么我会选择带有filter()的
是的,.exists()
比.count()
便宜 我从未见过这样定义的django模型,我希望,这只是一个伪模型
Shipment:
airwaybill_number (pk)
origin (not null)
destination (not null)
您的两个查询都是两个不同的查询.get()
vs.filter()
。后者提供queryset,而.get()
提供一个对象
对于.get()。在您的案例中,get()
的问题是,如果有多个,您可能会得到。这就是为什么我会选择带有filter()的
是的,.exists()
比.count()
便宜 您可能需要使用Queryset.get\u或\u create()
():
您可能需要使用Queryset.get\u或\u create()
():
感谢您的建议,我已使用原始代码更新了psuedo代码。感谢您的建议,我已使用原始代码更新了psuedo代码。