2010-01-20 9 views
0

У меня есть два классаДжанго ForeignKey вопрос

class A(models.Model): 
    id=models.IntegerField(primary_key=True) 
    name=models.CharField(max_length=200) 
    store_id=models.IntegerField() 
    type=models.ForeignKey(B) 

class B(models.Model): 
    id=models.IntegerField(primary_key=True) 
    type=models.CharField(max_length=10) 

class C(models.Model): 
    id=models.IntegerField(primary_key=True) 
    store=models.CharField(max_length=200) 

class D(models.Model): 
    id=models.IntegerField(primary_key=True) 
    type=models.CharField(max_length=10) 

В моем классе Atype является ForeignKey на B и store_id является логическим внешним ключом на C или D, в зависимости от величины type.

В полевых условиях я хочу показать значение store в зависимости от тип после некоторых расчетов. type расскажет мне о таблице i.e C Или D и в магазине магазина скажите мне строку в этой таблице c или d. Теперь я хочу показать значение в браузере, не перезаписывая значения. Возможно ли это?

ответ

1

Возможно, вам стоит взглянуть на Generic Relations.

+0

Это полезно, если вы хотите относиться к различным моделям. В случае с ОП он всегда относится к «С», я думаю. –

+0

@Felix: Я все еще думаю, что @zalew прав, указывая, что OP (по-видимому) пытается решить уже решенную проблему. DRY не является нерушимой заповедью, но это хорошая цель, к которой нужно стремиться. Жизнь слишком коротка, и у нас уже достаточно колес. :-) –

+0

@Peter: Я не хотел ничего говорить против СУХОЙ. СУХОЙ для победы !! ;) Но я думаю, что в этом случае общая вещь отношений слишком велика, поскольку 'A' всегда указывает на' C'. По моему мнению, общие отношения имеют смысл, если модель может относиться к различным типам ** моделей **, например. модель тега, которая может относиться к модели страницы или модели публикации. –

0

Если я правильно вас понял, то store_id всегда указывает на C справа? Но это значение зависит от поля type?
Если так что вы можете установить нормальную связь между этими моделями и установить store_id на основе type поля во время сохранения на носители:

class A(models.Model): 
    id=models.IntegerField(primary_key=True) 
    name=models.CharField(max_length=200) 
    store=models.ForeignKey(C) 
    type=models.ForeignKey(B) 

    def save(self,*args, **kwargs): 
     if self.type == some_type: 
      self.store = get_specific_store_here() 
     super(A, self).save(*args, **kwargs) 

И затем вы можете получить доступ к названию магазина:

# a is an object of model A 
a.store.store 

Если вы хотите придерживаться своего общего целого поля, вы можете просто добавить свой собственный метод:

class A(models.Model): 
    id=models.IntegerField(primary_key=True) 
    name=models.CharField(max_length=200) 
    store_id=models.IntegerField() 
    type=models.ForeignKey(B) 

    def get_store_name(): 
     store = C.objects.get(pk=self.store_id) 
     return store.store 
Смежные вопросы