2016-08-06 17 views
0

gibt es einen Weg, wie ich GenericForeignKey mit Feldern über zwei Modelle mit ForeignKey verbunden haben kann?Django GenericForeignKey Felder auf mehreren Modellen

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

Sie meinen, dass Sie eine FK auf zwei Modelle haben? – DurgaDatta

+0

Nein, ich habe ein Hauptobjekt und eine Reihe von untergeordneten Objekten, die alle auf ein anderes Modell des gleichen Typs zeigen. Um konsistent zu sein und keine Datentunnel zu duplizieren, möchte ich den content_type nur einmal im Hauptmodell speichern, auf das alle Child-Modelle zeigen müssen. –

Antwort

0

Ich musste meine eigene Bibliothek dafür schreiben. So, jetzt https://github.com/BrnoPCmaniak/django-egfk Ich kann dies tun:

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') 

Beispiel Nutzung:

>>> 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> 
Verwandte Themen