Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django查询-编写查询的最佳方式_Python_Django_Django Models_Django Queryset - Fatal编程技术网

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
特定装运的历史记录将至少更新十几次

  • 这些方法中有哪一种比其他方法更有优势,还是有更好的方法
  • 使用try/except是一种错误的实现方法吗
  • 就时间而言,查询过滤器选项是一个更昂贵的查询吗

  • 我从未见过这样定义的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代码。