【发布时间】:2018-08-15 13:46:06
【问题描述】:
最近我在update_or_create 方法中遇到问题。让我先做一个完整的解释。
型号:
class TransactionPageVisits(models.Model):
transactionid = models.ForeignKey(
Transaction,
on_delete=models.CASCADE,
db_column='transactionid',
)
sessionid = models.CharField(max_length=40, db_index=True)
ip_address = models.CharField(max_length=39, editable=False)
user_agent = models.TextField(null=True, editable=False)
page = models.CharField(max_length=100, null=True, db_index=True)
method = models.CharField(max_length=20, null=True)
url = models.TextField(null=False, editable=False)
created_dtm = models.DateTimeField(auto_now_add=True)
class Meta(object):
ordering = ('created_dtm',)
功能:
def _tracking(self, request, response, **kwargs):
txn_details = kwargs.get('txn_details')
data = {
'sessionid': request.session.session_key,
'ip_address': get_ip_address(request),
'user_agent': get_user_agent(request),
'method': request.method,
'url': request.build_absolute_uri(),
'transactionid': txn_details.txn_object,
'page': kwargs.get('page')
}
# Keep updating/creating tracking data to model
obj, created = TransactionPageVisits.objects.update_or_create(**data)
注意事项:
我知道我没有将任何 defaults 参数传递给 update_or_create(),因为在编写代码时它不是必需的(仅当所有列都为每个数据都是唯一的)。 _tracking() 也在中间件中,在每个请求和响应中都会被调用。
一切都很顺利,直到今天我遇到了以下异常:
File "trackit.py", line 65, in _tracking
obj, created = TransactionPageVisits.objects.update_or_create(**data)
File "/usr/local/lib/python2.7/dist-packages/Django-1.10.4-py2.7.egg/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/Django-1.10.4-py2.7.egg/django/db/models/query.py", line 488, in update_or_create
obj = self.get(**lookup)
File "/usr/local/lib/python2.7/dist-packages/Django-1.10.4-py2.7.egg/django/db/models/query.py", line 389, in get
(self.model._meta.object_name, num)
MultipleObjectsReturned: get() returned more than one TransactionPageVisits -- it returned 2!
我注意到在表中创建了两个具有完全相同值的条目(created_dtm 除外,因为它具有 auto_add_now=True):
| id | sessionid | ip_address | user_agent | page | method | url | created_dtm | transactionid |
| 32858 | nrq2vwxbtsjp8yoibotpsur0zit5jhoq | xx.xxx.xxx.xxx | Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0 | | GET | https://www.example.com/example_url/?jobid=5a9f2acb4cedfd00011c7d5d&transactionid=XXXXXXXXXXXX | 2018-03-06 23:57:00.061280 | XXXXXXXXXXXX |
| 32859 | nrq2vwxbtsjp8yoibotpsur0zit5jhoq | xx.xxx.xxx.xxx | Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0 | | GET | https://www.example.com/example_url/?jobid=5a9f2acb4cedfd00011c7d5d&transactionid=XXXXXXXXXXXX | 2018-03-06 23:57:00.062121 | XXXXXXXXXXXX |
为什么首先在表格中创建了重复条目?
【问题讨论】: