2016-07-30 4 views
0

У меня есть две модели:Django модели Field от OneToOneField

class FirstModel(models.Model): 
    foo = models.IntegerField(default=0) 
class SecondModel(models.Model): 
    bar = models.OneToOneField(FirstModel, on_delete=models.CASCADE, primary_key=True) 

Как сделать переменную baz, что от FirstModel.foo?

Я хочу это было так же просто, как:

class SecondModel(models.Model): 
    bar = models.OneToOneField(FirstModel, on_delete=models.CASCADE, primary_key=True) 
    baz = bar.foo 

Конечной Цели: Чтобы получить foo из экземпляра SecondModel как second_model_instace.foo.

ответ

3

Вы можете использовать related_name в модели связующей для обратной ссылки:

class FirstModel(models.Model): 
    foo = models.IntegerField(default=0) 
class SecondModel(models.Model): 
    bar = models.OneToOneField(FirstModel, ,related_name'baz', on_delete=models.CASCADE, primary_key=True) 

Теперь вы можете получить доступ, как first_model_intance.baz, если существует связь иначе вы получите DoesNotExsist исключение. default является:

Если вы не укажете related_name аргумент для OneToOneField, Django будет использовать имя строчной текущей модели в качестве значения по умолчанию .

Update: Если вы хотите получить second_model_instace.foo, вам не нужно даже related_name (обратную ссылку). Это прямая ссылка, которая уже является явной. Сначала получите first_model (через OneToOne поле), а затем его атрибут foo, то есть:

second_model_instance.bar.foo 
+0

Спасибо, я знал об этом. Я не был откровен с тем, что хотел. Я собираюсь обновить вопрос. Я хочу, чтобы это можно было сделать: 'second_model_instance.foo', чтобы получить foo. – Tsangares

+0

@Tsangares Я обновил ответ. Это то, что вы искали? – DurgaDatta

Смежные вопросы