2017-05-17 49 views
0

私はDjangoアプリを持っています。ここでは、旅行者が遠足で彼を連れ出すために地元にリクエストします。彼らは外出した後、お互いのための参照を残して、彼らが楽しいかどうか、そして何らかの記述があるかどうかについて言及します。外部キーに基づく相互参照の方法Django

ホームページでは、旅行者とローカルの両方がすでに満たされ、お互いに参照を残した最後の2つのリクエストを自動的に機能させたいと考えています。

現在、データは、人口統計からのものです。しかし、この

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): 
    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 ? 

です:

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) 

これは、リファレンスモデルは次のとおりです。

この

は、要求モデルです最後の2つのリクエストを一般的に(日付別に)戻します。私は最後の2つのリクエストを返したいと思います。互いの参照を残して、これらの参照を引き出す。

これがうまくいくように見える唯一の方法は、Populationスクリプトで大量の参照を埋め込んでアプリを見た目が悪くする場合です。

ありがとうございます!

答えて

0

あなたのモデルをリファクタリングする必要があり、最高のaproachはこのように、 "要求" と "リファレンス" 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 

かを

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"を取得できます。

関連する問題