2017-02-27 2 views
0
Customer.objects.filter(customer_id__in=contact_list_senders) 

contact_list_senders繰り返しクエリセットであるいくつかのcustomer_idsを含む繰り返しクエリセットである:ジャンゴobjects.filter(x__in = Y)yは

{sender_id1、sender_id2、sender_id1、sender_id2、sender_id1}

私はcontact_list_senders上記のコード

実際の出力とクエリセットからCustomerオブジェクトを検索してみてください。

{Customer1、Customer2}

所望の出力

{Customer1、Customer2、Customer1、Customer2、Customer1}

Iは、実際の出力ので理にかなって理解これらの連絡先と一致する顧客オブジェクトは2つだけです。あなたは希望の結果を得るために私を助けてもらえますか?

models.py:

class Customer(models.Model): 
    customer_id = models.CharField(max_length=244, blank=False, null=False) 
    first_name = models.CharField(max_length=244, blank=True, null=True) 
    last_name = models.CharField(max_length=244, blank=True, null=True) 
    email = models.CharField(max_length=244, blank=False, null=False) 
    enrollment_method = models.CharField(max_length=244, blank=True, null=False) 
    account_balance = models.DecimalField(default=0000.00, max_digits=6, decimal_places=2) 
    reserved_balance = models.DecimalField(default=0000.00, max_digits=6, decimal_places=2) 
    modified = models.DateTimeField(auto_now_add=True) 
    created = models.DateTimeField(auto_now_add=True) 
+0

あなたはlist_senderでループを実行し、その結果を1つにまとめる必要があるようです。 – viviwill

答えて

1

あなたは良いスタートを持っていますが、あなたはPythonで残りを行う必要があるでしょう:

customers = {x.customer_id: x for x in Customer.objects.filter(customer_id__in=contact_list_senders)} 
final_customer_list = [customers[x] for x in contact_list_senders] 

この最初の顧客に対応付ける辞書顧客IDを構築します(すべてのデータベースクエリーは必要ありません)、それを使用して重複を含む最終的なリストを作成します。

最初のリストは顧客IDのリストであると仮定していますが、そうでない場合は簡単に適合させることができます。

+0

複数のクエリを必要とせずにすばらしいソリューション。どうもありがとう! – Berk

+0

問題ありません!:) – Ben

0

テーブルにプライマリインデックスが表示されない場合は、customer_idフィールドが1である必要があります。

class Sender(models.Model): 
    customer = models.ForeignKey(Customer) 
    # .. and the other fields od a sender 

class Customer(models.Model): 
    customer_id = models.CharField(max_length=244, blank=False, null=False, primary_key=True) 
    # .. and the other fields of a customer 

そしてクエリセット:

# Replace all() with filter(your_params) 
sender_list = Sender.objects.select_related('customer').all() 

your_desired_output = [sender.customer for sender in sender_list] 
その場合、あなたは、モデルは、そのようになるはずです(多くの送信者が一人の顧客に関連することができます)多対1の関係を持つ2つのモデルを持っている場合

selected_related方法は、(クエリセットの繰り返し処理を行う場合、すべての送信者に対して個別のクエリを実行しないように)関係をたどると、同じクエリ内の関連する顧客のオブジェクトを取得するにはDjangoに指示します。ほとんどのデータベースでは、顧客の左ジョイントで1つの選択を意味するので、かなり効果的です。

私はそれがDjangoでそれを行う正しい方法であると信じています。プライマリ・キーを使用しない理由がある場合や、モデル間でこのような関係を確立できない場合は、user6731765によって送信された解決策を試すか、未処理の問合せを試す必要があります。

+0

貴重な入力、送信者、および受信者のおかげで、感謝の気持ちは両方の顧客オブジェクトであり、すべての顧客間のすべての関係を持つContactテーブルがあります(チャットアプリケーションのように、リレーションはチャットルームです)。私はContactテーブルをこのメソッドに適合するように少し変更することができると思いますが、多くのコードに影響しますので、このメソッドを今のところ使用することはできません。しかし、何か新しいおかげで学んだ! – Berk

関連する問題