如何基于外键进行交叉引用?姜

2024-06-01 01:45:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django应用程序,一个旅行者“请求”当地人带他出去旅游。出去之后,他们会给对方留一个参考资料,告诉对方他们是否玩得开心,以及一些书面描述。在

在主页上,我想自动显示最后两个请求,旅行者和当地人已经见面,并为彼此留下参考。在

目前数据来自人口脚本。在

这是请求模型:

 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)

这是参考模型:

^{pr2}$

这是我实现我想要的目标的尝试:

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()

然而,这通常会返回最后两个请求(按日期),我希望返回最后两个请求,其中两个请求都为彼此留下了一个引用,并提取这些引用。在

唯一可行的方法是在填充脚本中填充大量引用,使应用看起来很糟糕。在

谢谢!在


Tags: 脚本truedateobjectsmodelsrequestlocalfilter
1条回答
网友
1楼 · 发布于 2024-06-01 01:45:26

你必须重构你的模型,最好的方法是用“请求”建立“引用”一对一的关系,如下所示:

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())

那么你可以试试这个:

^{pr2}$

或者,你可以提出一个简单的请求:

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')

。。。有了这个,你可以得到请求.id“两个参考。在

相关问题 更多 >