2015-01-20 3 views
5

Я Тринг некоторые, как это:ForeignKey отношение к абстрактному классу

class F(models.Model): 
    class Meta: 
     abstract = True 

class C1(F): 
class C2(F): 

class D(F): 
     pid = models.ForeignKey(Cx) 

где Cx может быть или C1 или C2, но я не знаю, как это сделать.

Может ли кто-нибудь привести меня? Благодаря

Python 3,3 Джанго 1,7

ответ

2

Что вы просите не представляется возможным напрямую, вы не можете иметь ForeignKey к абстрактной модели, как и абстрактные модели не имеют таблиц базы данных для установления связи.

Вы можете сделать любую из двух вещей. Либо сделайте F конкретным классом, есть некоторые недостатки, но это неплохой путь.

class F(models.Model): 
    pass 

class C1(F): 
    pass 
class C2(F): 
    pass 

class D(F): 
     pid = models.ForeignKey(F) 

Или использовать GenericforeignKey, который является немного более сложным, особенно если вам нужно ограничить выбор модели.

1

Как уже упоминалось в другом ответе, поскольку абстрактные классы не имеют таблицы, вы не можете относиться к ним.

Вы можете, однако, подражать такому поведению с один-к-одному отношений:

class F(models.Model): 
    pass # stuff here 

class C1(models.Model): 
    f = models.OneToOneField(F) 

class C2(models.Model): 
    f = models.OneToOneField(F) 

class D(F): 
     pid = models.ForeignKeyField(F) 

Вам придется вручную найти, если ПИД- C1 или C2, но вы никогда не будете иметь сценарий где один экземпляр F связан с более чем одним экземпляром C1 или C2.

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