我有一个用户共享模型,如下所示:
class Share( models.Model ):
sharer = models.ForeignKey(User, verbose_name=_("Sharer"), related_name='sharer')
receiver = models.ForeignKey(User, verbose_name=_("Receiver"), related_name='receiver')
class Meta:
unique_together = ( ("sharer", "receiver"), ("receiver", "sharer") )
我想为共享者(S)和接收者(R)保存一个对象(顺序与RS或SR无关)。但以上 unique_together 将无法实现这一点;假设 RS 在数据库中,然后如果我保存 SR,我将不会对此进行验证。为此,我为 Share 模型编写了自定义唯一验证。
def validate_unique(
self, *args, **kwargs):
super(Share, self).validate_unique(*args, **kwargs)
if self.__class__.objects.filter( Q(sharer=self.receiver, receiver=self.sharer) ).exists():
raise ValidationError(
{
NON_FIELD_ERRORS:
('Share with same sharer and receiver already exists.',)
}
)
def save(self, *args, **kwargs):
# custom unique validate
self.validate_unique()
super(Share, self).save(*args, **kwargs)
这种方法在正常使用中效果很好。
问题: 我有一个匹配算法,它获取共享和接收者的请求并保存共享对象(SR 或 RS),然后几乎同时向它们发送响应(共享对象) 。当我使用查询检查重复(无数据库级别)时,这需要时间,所以最后我有 2 个对象 SR 和 RS。
我想要一些解决方案,对于共享者 S 和接收者 RI 只能保存单个共享对象,SR 或 RS 否则会得到一些验证错误(如数据库的 IntegrityError)。
Django=1.4,数据库=Postgresql