2017-08-15 2 views
0

私はDjangoの1.11 & Python3.5での私のモデルの3つのクラスがあるとします。DjangoのForeignKeyのフィールドをデコレータを使用して事前に設定する方法はありますか?

クラス1:

class Country(models.Model): 
    name = models.CharField(max_length=255) 

    def __str__(self): 
     return self.name 

クラス2:

class City(models.Model): 
    country = models.ForeignKey(Country) 
    name = models.CharField(max_length=255) 
    latitude = models.DecimalField(max_digits=15, decimal_places=10) 
    longitude = models.DecimalField(max_digits=15, decimal_places=10) 

    def __str__(self): 
     return self.name 

クラス3:

class Profile(AbstractUser): 
    username = models.ForeignKey(User, max_length=100, blank=False, unique=True) 
    address = models.CharField(max_length=255, blank=False) 
    city = models.ForeignKey(City, on_delete=models.CASCADE, related_name="city_set", max_length=100, blank=False, null=True) 
    country = models.CharField(max_length=255, blank=False) 
    birthplace = models.ForeignKey(City, on_delete=models.CASCADE, related_name="birthplace_set", max_length=100, blank=False, null=True) 
    latitude = models.DecimalField(max_digits=15, decimal_places=10) 
    longitude = models.DecimalField(max_digits=15, decimal_places=10)  

    def __str__(self): 
     return self.username 

    @property 
    def country(self): 
     if not self.city: 
      return False 
     else: 
      negara = City.objects.get(name=self) 
      return negara.country 

    @property 
    def latitude(self): 
     if not self.birthplace: 
      return False 
     else: 
      lat = City.objects.get(latitude=self) 
      return lat.latitude 

    @property 
    def longitude(self): 
     if not self.birthplace: 
      return False 
     else: 
      lnt = City.objects.get(longitude=self) 
      return lnt.longitude 

私の質問は:

  1. 都市の属性(都市の階級からのForeignKey)からプロフィールのクラスの国の属性を取得して自動入力/事前入力する方法を教えてください。 @propertyデコレータを使用して取得しようとしましたが、はありません。値。
  2. 1つのクラス(Profileのクラス)のForeignKeyフィールドに同じクラス(Cityクラスのクラス)を2回一緒に使用できますか?この場合、都市&出生地の属性であり、上記の質問を出生地の属性から緯度&の経度の属性について繰り返します。

答えて

1

これらのフィールドと@property呼び出しを設定する目的は何ですか?それは同様に経度と緯度の特性で動作

person.city.country.name 
    person.city.longitude 
    person.city.latitude 

: 私はむしろ、このようなダイレクトコールを使用します。しかし、あなたが事前にCharFieldですが必要な場合には、そのような保存()メソッドでそれを行うことができます。

Class Person(models.Model): 
    ... 
    def save(self, *args, **kwargs): 
     self.country = self.city.country.name 
     self.longitude = self.city.country.name 
     self.latitude = self.city.country.name 
     super(Person, self).save(*args, **kwargs) 

そして、あなたが望むようはい、あなたはできるだけ多くのForeignKeyのフィールドを使用することができます。

+0

それは私を助けて、あなたの助けをありがとう、私はこれを使用して終わる: @property デフ国(自己): ない場合はself.city: はfalse を返す: リターンself.city.countryを。名 – pije

関連する問題