3

私は Django を初めて使用し、このクエリを構築しようとして頭を悩ませています。

  • OneToOneフィールドでUserに接続されたBaseProfileがあります。
  • OneToOneフィールドに接続されたCustomerProfileのプロファイルをBaseProfileに特化しています。
  • CustomerProfileは、RelatedCustomerモデルを通じて、他のCustomerProfile (つまりそれ自体)とのManyToMany関係を持ちます。
  • RelatedCustomerで、from_customerおよびto_customer 外部キーを指定します。



画像があるとよくわかるかもしれません。

ここに画像の説明を入力

私の問題:
user.id が与えられた場合、彼が接続している顧客の他のすべての user.id を知る必要があります( from_customerto_customerを通過します):

したがって、基本的には、最初に逆ルックアップを使用して User から RelatedCustomer まで掘り下げ、すべてのセットを取得してから、セット内の各顧客 のuser.idを知る必要があります。

EDIT2:

私がこれまでに到達したこと:

# This gives me back a customer profile given a user.id (2)
cm = CustomerProfile.objects.get(base_profile__user=2)

# M2M lookup. Given one customer returns all the RelatedCustomer relations
# that he has as a part of the 'from' M2M
cm.from_photographer.all()

前の 2 つの連鎖: user.idを指定して、CustomerRelated リレーションのクエリセットを取得します。

rel = CustomerProfile.objects.get(base_profile__user=2).from_photographer.all()

これにより、次のようなものが返されます。

[<CustomerRelated: from TestCustomer4 to TestCustomer2 >, 
 <CustomerRelated: from TestCustomer4 to TestCustomer3 >]

この場合、user.id=2を持つユーザーはTestCustomer4です。

私の質問:

ここまでは順調ですが、これを設定して to_customer のすべての user.id を取得するにはどうすればよいです?
つまり、とのuser.idを取得するにはどうすればよいですか?TestCustomer2TestCustomer3

4

2 に答える 2

5

まず、これは django でデータベースをクエリする方法ではありません。第二に(あなたは学んでいるので)、dbshellさまざまなことを試すために走ることができることを指摘するのは良いことです. そして最後に、この種の問題はドキュメントに記載されています。

初心者として、全体をナビゲートするのが少し難しいと感じたので、これを言っています. 物事を見つける最善の方法は、Google を使用して、最後にdjangoを追加することです。

お気持ちはわかりますが、ドキュメンテーション検索は最悪ですよね?へー、私はあなたを感じます、それがあなたがいつも私が説明した方法で検索する理由です。ドキュメントのコツをつかむと、ドキュメントのタイトル ページがもう少し直感的になっていると感じるでしょう。

さて、答えは次のとおりです。またはフィールドにアクセスするManyToManyには、一般にdunderとして知られているを使用する必要があります。OneToOneForeignKey__

だから、これはがこれを行う方法です。他の方法があり、これを行うにはより良い方法がある可能性があることに注意してください。

thing_I_want = RelatedCustomer.objects.get(to_customer__id=2)

ただし、顧客のリストを取得する場合は、 を使用することに注意してくださいfilter()。以下に例を示します (例として購入数を使用しています)。

things_I_want = RelatedCustomer.objects.filter(to_customer__no_of_purchases=16)

また、フィルタの優れた点は、1 つのフィルタを別のフィルタの上に積み重ねることです。これらの機能の詳細については、以下に提供するドキュメント リンクを参照してください。

それはあなたが望むものを手に入れるでしょう。さて、これについてさらに多くの質問があるかもしれません. 恐れる必要はありません。このドキュメント リンクをクリックして確認してください。

EDIT あなたがやりたいことはdjangoでできるようですが、SQLを使ってやりたいのなら、それも可能です。たとえば、SomeModel.objects.raw("SQL_HERE"). 通常、テーブルの名前は<app>_<model>.

ただし、あなたが求めていることは、ORMを使用してdjangoでも実行できます。しかし、それは難しいでしょう。

于 2013-07-17T06:44:06.540 に答える
0

わかりました、いつものように、答えが得られるときはいつも、予想よりずっと簡単に見えます。

私はこれが私のために働いたと思います:

User.objects.filter(base_profile__customer_profile__to_customer__in=
User.objects.get(id=2).base_profile.customer_profile.from_customer.all())

@Games Brainiacに感謝します

于 2013-07-19T02:02:40.417 に答える