2011-12-26 11 views
1

私はDjangoで顧客データベースを作成しています。各顧客は複数のアドレスを持つことができ、顧客レコードはこれらのアドレスの1つを請求先アドレスとして指し示します。これは外部キーとして設定され、各アドレスには、それを所有する顧客を指す外部キーがあります。親レコードと同時に挿入された外部キーへの参照を自動的に追加します

新しい顧客を作成しようとすると問題が発生します。新しい顧客には明らかにまだ住所がないので、請求先住所のドロップダウンは空でなくてもかまいません(または良い、不在)。もちろん、他の顧客の住所を表示することも、許可することもできません。

アドレスは、[カスタマー管理]ページにインラインで入力します。

  1. 新しい顧客と少なくとも1つのアドレスを作成する(または編集後に少なくとも1つのアドレスで終了する)方法を教えてください。

  2. 請求先住所を指定する必要がありますが、請求先住所を特定の顧客に関連付けられた最初の住所に自動的に設定するにはどうすればよいですか?請求先住所として指摘された住所が削除された場合は、告訴状を提出する必要があります。

  3. 請求先住所のプルダウンで現在の顧客の住所のみを表示するにはどうすればよいですか?私はlimit_choices_toオプションを知っていますが、selfが定義されていないCustomerクラスのbilling_addressカラムを宣言するときには、limit_choices_toを使用する必要があることを前提として、現在のオブジェクトを参照する方法はわかりません。現在のオブジェクトの主キーを取得できません。ここで

、これまで私が持っているコードの簡易版である:

from django.db import models 

class Address(models.Model): 
    customer = models.ForeignKey("Customer") 
    street = models.CharField(max_length=128) 
    city = models.CharField(max_length=128) 

    def __unicode__(self): 
     return "%s, %s" % (self.street, self.city) 

class Customer(models.Model): 
    last_name = models.CharField(blank=True, max_length=64) 
    first_name = models.CharField(blank=True, max_length=64) 
    billing_address = models.ForeignKey("Address", null=True, blank=True, related_name="+") 

    def __unicode__(self): 
     return "%s %s" % (self.first_name, self.last_name) 

答えて

0

は一つのアドレスが入力されたことを確認している場合のみでしょう、あなたの顧客のためのモデルpre_save signalでリッスンする方法を作成します。 1つは入力され、請求先住所に設定されました。アドレスが入力されなかった場合、例外が発生します。

関連する請求先住所のみを表示するには、ModelChoiceFieldを使用して自動的にエントリをフィルタリングします。

+0

私は、現在の顧客の住所のみを表示するようにModelChoiceFieldを設定する方法についてはまだ明確ではありません。 'queryset'をどうすればいいですか? 'Address.objects.all()'は明らかにそれが誰のアドレスでもないので、そのコンテキストに 'self'が定義されていないので、この顧客のアドレスだけにフィルタリングする方法はわかりません。 – tremby

+0

また、周りのいくつかの演奏の後、私は最初の部分を把握することもできません。 Customerモデルから入力されたアドレスの数を取得するにはどうすればよいですか? clean()では、pre_saveとpost_save 'self.address_set.all()。count()'は保存されるまで常に0になります。 (これはpost_saveハンドラにも格納されません)。 – tremby

関連する問題