2017-07-19 21 views
0

Mozillaライブラリからthis tutorialを探しています。私はデータベース関係に基づいて管理者のリストビューを作成したい。たとえば、私はVehicleモデルとstatusUpdateモデルを持っています。車両は、多くのstatusUpdateを持つ単一のインスタンスです。私がしたいのは、(私が作成したdateTimeフィールドに基づいて)最新のstatusUpdateを選択し、そのデータをリストビューで利用できるようにすることです。ListViewで表示するために関連するオブジェクトを1対多の関係から取得してフィルタリングする方法

チュートリアルは言及:

class Vehicle(models.Model): 

class statusUpdate(models.Model): 
    vehicle = models.ForeignKey(Vehicle, on_delete=models.CASCADE) 

質問:はどのように私はモデルの関係を持つリストビューを行うと子の関係にフィールドでフィルタリングし、ビューに渡すことができるだろうか?

答えて

2

私がクラスベースビュー(CBV)で欲しかったことは、私の問題についての私の説明はあまり明確ではありませんでした。

def get_context_data(self, **kwargs): 

get_context_dataは、通常は一般的なビューではないデータを取得する方法です。ビークルは既にモデルに定義されているため、ビューに提供されています。新しいコンテキストを提供する必要がある別のモデルのオブジェクトを渡す場合は、get_context_dataを使用します。 statusUpdateは、外部キーがVehicleになっているモデルです。以下の完全な例。

class VehicleDetail(generic.DetailView): 
    model = Vehicle 
    template_name = 'fleetdb/detail.html' 


    def get_context_data(self, **kwargs): 
     # Call the base implementation first to get a context 
     context = super(VehicleDetail, self).get_context_data(**kwargs) 
     context['updates'] = statusUpdate.objects.filter(vehicle_id=1).order_by('-dateTime')[:5] 
     return context 
0

私はあなたの問題を完全に解決するとは思わない。あなたはこれを使用:

context['updates'] = statusUpdate.objects.filter(vehicle_id=1).order_by('-dateTime')[:5] 

これだけvehicle_idは私が苦しんでいた部分は、主キー(あなたのケースでは、実際のvehicle_id)を取得する方法である1に設定されてstatusUpdatesのリストになります。私はこの解決策を見つけた:

vehicle_id = context['vehicle'].pk # <- this is the important part 
context['updates'] = statusUpdate.objects.filter(vehicle_id=vehicle_id).order_by('-dateTime')[:5] 

(したがって、あなたがそれを使用する前に、スーパーを呼び出す必要があります)、私はコンテキストオブジェクトを発見し、それがすでに追加されているデータが含まれています。私はそれを書き留めるようになったので、それはとても明らかですが、実現するまでには数時間かかりました。

Btw。私はDjangoとPythonにはかなり新しいので、これは他人には明らかかもしれませんが、私にとってはそうではありませんでした。

+0

あなたは正しいです、私が投稿したコードは最終的に車両のpkを含むように変更されました。ここでコードを更新するのを忘れてしまった。ハードコーディングされた '1'は私のテストでした。 – dieusu

+0

さらに読むための良いリンクhttps://stackoverflow.com/questions/36950416/when-to-use-get-get-queryset-get-context-data-in-django – dieusu

+0

ああ、私は追加したくありませんでしたもう一つの答え。私のテキストはコメントだったはずです。お返事をありがとうございます。 – AlexWerz

関連する問題