感谢您花时间阅读我的问题.
我有一个带有以下型号的django应用程序:
class UserProfile(models.Model):
user = models.OneToOneField(User)
...
class Visit(models.Model):
profile = models.ForeignKey(UserProfile)
date = models.DateField(auto_now_add=True, db_index=True)
ip = models.IPAddressField()
class Meta:
unique_together = ('profile', 'date', 'ip')
Run Code Online (Sandbox Code Playgroud)
在一个视图中:
profile = get_object_or_404(Profile, pk = ...)
get, create = Visit.objects.get_or_create(profile=profile, date=now.date(), ip=request.META['REMOTE_ADDR'])
if create: DO SOMETHING
Run Code Online (Sandbox Code Playgroud)
一切正常,但Postgres日志已满,重复键错误:
2012-02-15 14:13:44 CET ERROR: duplicate key value violates unique constraint "table_visit_profile_id_key"
2012-02-15 14:13:44 CET STATEMENT: INSERT INTO "table_visit" ("profile_id", "date", "ip") VALUES (1111, E'2012-02-15', E'xx.xx.xxx.xxx') RETURNING "table_visit"."id"
Run Code Online (Sandbox Code Playgroud)
试过不同的解决方案,例如
from django.db import transaction
from django.db import IntegrityError
@transaction.commit_on_success
def my_get_or_create(prof, ip):
try:
object = Visit.objects.create(profile=prof, date=datetime.now().date(), ip=ip)
except IntegrityError:
transaction.commit()
object = Visit.objects.get(profile=prof, date=datetime.now().date(), ip=ip)
return object
....
created = my_get_or_create(prof, request.META['REMOTE_ADDR'])
if created: DO SOMETHING
Run Code Online (Sandbox Code Playgroud)
这只对MySQL有帮助吗?有谁知道如何为postgres提供重复的键值错误?
这些错误的另一个可能原因get_or_create()
是其中一个搜索字段中的数据类型不匹配 - 例如传递False
而不是None
传入可空字段。在.get()
里面.get_or_create()
不会找到它,Django将继续与新行创造-这将失败的原因PostgreSQL的限制。
归档时间: |
|
查看次数: |
3605 次 |
最近记录: |