Python 如何基于外键进行交叉引用?德扬戈
我有一个Django应用程序,一个旅行者“请求”当地人带他出去旅游。在他们出去后,他们会留下一封推荐信,让对方提及他们是否玩得开心,以及一些书面描述 在主页上,我想自动显示最后两个请求,旅行者和当地人都已经见面,并为彼此留下了参考 目前数据来自于人口脚本 这是请求模型:Python 如何基于外键进行交叉引用?德扬戈,python,django,django-models,filter,django-views,Python,Django,Django Models,Filter,Django Views,我有一个Django应用程序,一个旅行者“请求”当地人带他出去旅游。在他们出去后,他们会留下一封推荐信,让对方提及他们是否玩得开心,以及一些书面描述 在主页上,我想自动显示最后两个请求,旅行者和当地人都已经见面,并为彼此留下了参考 目前数据来自于人口脚本 这是请求模型: class Request(models.Model): """traveler requests local to take her out upon liking her profile""" travel
class Request(models.Model):
"""traveler requests local to take her out upon liking her profile"""
traveler = models.ForeignKey(User, related_name='traveler_requests')
local = models.ForeignKey(User, related_name='local_requested')
message = models.CharField(max_length=500)
date = models.DateField()#date of excursion
local_approval = models.BooleanField(blank=True)
这是参考模型:
class Reference(models.Model):
author = models.ForeignKey(User, related_name='referencer')#can be local or traveler
referenced = models.ForeignKey(User, related_name='referencee')#can be local or traveler
description = models.CharField(max_length=500, default="default reference")
fun = models.BooleanField() #did you have fun with the person or not?
date = models.DateField(default=datetime.datetime.now())#in order to pull the last ref on index page
local = models.BooleanField(default=True) #Is the author a local ?
这是我试图实现我想要的:
reqs = Request.objects.filter(local_approval=True).order_by('-date')[:2]
for i in range(len(reqs)):
local_references_traveler = Reference.objects.filter(fun=True, author=reqs[i].local, referenced=reqs[i].traveler, local=True).latest()
traveler_references_local = Reference.objects.filter(fun=True, author=reqs[i].traveler, referenced=reqs[i].local, local=False).latest()
然而,这通常会返回最后两个请求(按日期),我想返回最后两个请求,其中两个人都为对方留下了一个引用,并提取这些引用
唯一可行的方法是,如果我在填充脚本中填充大量引用,使应用程序看起来很糟糕
谢谢 你必须重构你的模型,最好的方法是用“请求”来“引用”一对一的关系,如下所示:
class Reference(models.Model):
request = models.OneToOneField(
Request,
on_delete=models.CASCADE,
primary_key=True,
)
author_desc = models.CharField(max_length=500)
referenced_desc = models.CharField(max_length=500)
author_fun = models.BooleanField()
referenced_fun = models.BooleanField()
author_date = models.DateField(default=datetime.datetime.now())
referenced_date = models.DateField(default=datetime.datetime.now())
class Reference(model.Models):
request= ForeignKey(Request)
author = models.ForeignKey(User, related_name='referencer')#can be local or traveler
# referenced = models.ForeignKey(User, related_name='referencee')#this isn't necesary
description = models.CharField(max_length=500, default="default reference")
fun = models.BooleanField() #did you have fun with the person or not?
date = models.DateField(default=datetime.datetime.now())#in order to pull the last ref on index page
local = models.BooleanField(default=True) #Is the author a local ?
然后你可以试试这个:
r = Reference.objects.select_related('request').filter(author_fun=True,referenced_fun=True).order_by('-request__date')
# Don´t forget index or another filter for optimization
或者您可以制作一个简单的FK来请求,如下所示:
class Reference(models.Model):
request = models.OneToOneField(
Request,
on_delete=models.CASCADE,
primary_key=True,
)
author_desc = models.CharField(max_length=500)
referenced_desc = models.CharField(max_length=500)
author_fun = models.BooleanField()
referenced_fun = models.BooleanField()
author_date = models.DateField(default=datetime.datetime.now())
referenced_date = models.DateField(default=datetime.datetime.now())
class Reference(model.Models):
request= ForeignKey(Request)
author = models.ForeignKey(User, related_name='referencer')#can be local or traveler
# referenced = models.ForeignKey(User, related_name='referencee')#this isn't necesary
description = models.CharField(max_length=500, default="default reference")
fun = models.BooleanField() #did you have fun with the person or not?
date = models.DateField(default=datetime.datetime.now())#in order to pull the last ref on index page
local = models.BooleanField(default=True) #Is the author a local ?
然后可以创建一个注释子句:
ref_group = Reference.objects.values('request__id') \
.annotate(num_reference=Count('id')) \
.filter(num_reference=2)
.order_by('-request__id')
。。。有了这个,您可以获得所有带有两个引用的“request.id”