我有一个用户共享模型,如下所示:
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") )
Run Code Online (Sandbox Code Playgroud)
我想为sharer(S)和receiver(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)
Run Code Online (Sandbox Code Playgroud)
此方法在正常使用中正常工作.
问题: 我有一个匹配的算法,它获取共享和接收者的请求并保存共享对象(SR或RS),然后几乎同时发送响应(共享对象).因为我检查与查询重复(没有数据库级别)需要时间,所以最后我有2个对象SR和RS.
我想要一些解决方案,对于共享者S和接收者RI只能保存单个共享对象,SR或RS否则会得到一些验证错误(如数据库的IntegrityError).
Django = 1.4,Database = Postgresql
我有一个算法,它等待近 5 秒来生成响应,我想在用户发送请求后立即向用户发送一个 ack(http 200),告诉他他的请求已收到并等待 5 秒。
发电机功能:
def chunked_res():
yield "Chunk 1"
stop = time.time() + 5 # wait for 5 seconds
while time.time() < stop:
pass
yield "Chunk 2"
Run Code Online (Sandbox Code Playgroud)
在某些方面:
response = HttpResponse ( chunked_res() )
response['Connection'] = 'close'
response['Transfer-Encoding'] = 'chunked'
response['status'] = 200
return response
Run Code Online (Sandbox Code Playgroud)
浏览器中的响应:
"传输编码:分块\n状态:200\n连接:关闭\n内容类型:文本/html;字符集=utf-8\n\nChunk 1Chunk 2"
问题: 我得到了要求的响应(Chunk 1,Chunk 2),但在 5 秒后。我想先发送“Chunk 1”,然后在 5 秒后发送“Chunk 2”(更新响应)。是否有任何特定的设置/更改来实现这一点?
更新:
Django = 1.4 蟒蛇 = 2.7