2016-08-06 87 views
0

有没有办法让GenericForeignKey具有与ForeignKey连接的两个模型上的字段?多个模型上的Django GenericForeignKey字段

from django.db import models 
from django.contrib.contenttypes.fields import GenericForeignKey 
from django.contrib.contenttypes.models import ContentType 

# Create your models here. 

class Main(models.Model): 
    text = models.TextField() 
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) 

class Child(models.Model): 
    object_id = models.PositiveIntegerField() 
    main = models.ForeignKey(Main) 
    content_object = GenericForeignKey('main__content_type', 'object_id') 
+0

你的意思是说,你想有一个FK两个型号? – DurgaDatta

+0

不喜欢我有一个主对象和一堆儿童对象,它们都指向一些其他相同类型的模型。为了保持一致并且不重复数据的调整,我想只在所有儿童模型必须指向的主模型中存储一次content_type。 –

回答

0

我必须为它编写我自己的库。 https://github.com/BrnoPCmaniak/django-egfk 所以,现在我可以这样做:

class Main(models.Model): 
    content_type = models.ForeignKey(
     ContentType, on_delete=models.CASCADE, blank=True, null=True) 


class Child(models.Model): 
    object_id = models.PositiveIntegerField() 
    main = models.ForeignKey(Main, related_name="child") 
    content_object = EnhancedGenericForeignKey('main.content_type', 'object_id') 

用法示例:

>>> from test_egfk.models import Main, Child, TestSampleModel 
>>> m = Main() 
>>> print(m.content_type) 
None 
>>> m.save() 
>>> t = TestSampleModel(text="Test") 
>>> t.save() 
>>> t.text 
'Test' 
>>> c = Child(main=m, content_object=t) 
>>> c.save() 
>>> Main.objects.last().content_type 
<ContentType: test sample model> 
>>> c.content_object 
<TestSampleModel: TestSampleModel object>