[英]How to cross reference based on foreign keys? Django
我有一個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)
這是參考模型:
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()
但是,這通常會帶回最后兩個請求(按日期),我想返回最后兩個請求,兩個人都留下了彼此的引用,並提取了這些引用。
這似乎可行的唯一方法是,如果我在填充腳本中填充了大量引用,使應用看起來很糟糕。
謝謝!
您必須重構模型,最好的方法是通過“請求”使“參考” one_to_one關系成為可能,如下所示:
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())
然后,您可以嘗試以下操作:
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(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”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.