Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何基于外键进行交叉引用?德扬戈_Python_Django_Django Models_Filter_Django Views - Fatal编程技术网

Python 如何基于外键进行交叉引用?德扬戈

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

我有一个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()
然而,这通常会返回最后两个请求(按日期),我想返回最后两个请求,其中两个人都为对方留下了一个引用,并提取这些引用

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


谢谢

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

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”