1
我在django上使用一组foreignkey关系在django上出现重复键完整性错误的细微错误。Django IntegrityError Foreignkey上的重复条目
我有以下功能:
def update_relationship(actor, action, status, target):
existing = Relation.objects.filter(actor=actor, target=target)
# If this relation is 'on', turn it off
if Relation.objects.filter(actor=actor, target=target, status=status):
Relation.objects.filter(actor=actor, target=target).update(status="")
# If this relationship is not on, turn it on
else:
created = True
if existing:
existing.update(status=status)
else:
Relation.objects.create(actor=actor, target=target, status=status)
正如你所看到的,我测试,看看是否关系数据库中已存在,然后更新它,如果它存在,如果它创建一个新的行才不是。然而,似乎在某些条件下,我无法再现,Django给我一个重复的关键错误,即使在我所知道的情况下,只有一个实例。
仅供参考,这里是模型定义:
class Relation(models.Model):
Status = Choices(('L', 'Like', 'Like'),
('D', 'Dislike', 'Dislike'),
('S', 'Save', 'Save'))
actor = models.ForeignKey('members.Member', related_name='relations')
target = models.ForeignKey('members.Member', related_name='reverse_relations')
status = models.CharField(choices=Status, max_length=10)
created = models.DateTimeField('created', auto_now_add=True)
notified = models.BooleanField(default=False)
notified_mutual = models.BooleanField(default=False)
class Meta:
unique_together = (('actor', 'target'),)
ordering = ('created',)
verbose_name = 'Relation'
verbose_name_plural = 'Relations'
它会是一种不错的,如果Django的有一个update_or_create方法,但这似乎比我的方法更好的方法。谢谢! – ChrisBurnor 2012-07-25 18:26:10
好的。奇怪的是,即使使用Django的get_or_create,这仍然会发生。我想也许是因为没有设置默认值,但即使默认值仍然存在。 – ChrisBurnor 2012-08-15 20:11:38