Выпуск Django ForeignKey - PullRequest
       12

Выпуск Django ForeignKey

0 голосов
/ 20 января 2010

У меня есть два класса

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)

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

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

Ответы [ 2 ]

1 голос
/ 20 января 2010

Может быть, вам стоит взглянуть на Общие отношения .

0 голосов
/ 20 января 2010

Если я вас правильно понял, то 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
...