2016-09-13 1 views
2

Ich versuche, generische Beziehungen zu verwenden, sieht mein Modell wie folgt aus:Kann nicht Stichwort ‚content_type‘ in das Feld lösen

class Post(models.Model): 
    # Identifiers 
    user = models.ForeignKey(User, unique=False, related_name = 'posts') 
    # Resource 
    resource_type = models.ForeignKey(ContentType) 
    resource_id = models.PositiveIntegerField() 
    resource = GenericForeignKey('resource_type', 'resource_id') 

    # Other 
    date_created = models.DateTimeField(auto_now=False, auto_now_add=True, blank=True) 

    class Meta: 
     unique_together = ('resource_type', 'resource_id',) 

Wenn jedoch auf meine Ressource versuche ich, das Post-Objekt zu erhalten, mit SomeResource.posts ' Die folgende Ausnahme tritt auf:

Kann Schlüsselwort "content_type" nicht in Feld auflösen. Zur Auswahl stehen: date_created, id, Ressource, RESOURCE_ID, RESOURCE_TYPE, resource_type_id, Benutzer user_id

Warum es für content_type suchen, wenn ich es ausdrücklich genannt resource_type auf meinem GenericForeignKey?

Antwort

0

Haben Sie einen bestimmten Grund, 'Ressource' anstelle von 'Inhalt'/'Objekt' zu verwenden?

Wenn nicht, würde ich vorschlagen, alle drei Linien zu den allgemeinen Beziehungen wie diese (wie auch Meta) im Zusammenhang zu ändern:

content_type = models.ForeignKey(ContentType) 
object_id = models.PositiveIntegerField() 
content = GenericForeignKey('content_type', 'object_id') 

ich immer auf diese Feldnamen für generische Beziehungen bleiben (basierend auf the documentation), obwohl in der Dokumentation erwähnt wird, dass sowohl 'content_type' als auch 'object_id' umbenannt werden können (vielleicht muss nur 'content' unverändert bleiben ...). Ich bin in Django nicht gut genug, um das Verhalten zu erklären.

Hoffe, dass es machbar ist, und arbeitet für Ihr Projekt

+0

ich sie zum besseren Lesbarkeit und Einheitlichkeit, ändern wollte, weil ich der Standardname denke, ein bisschen klobig ist. –

+0

Hier [link] (http://stackoverflow.com/questions/18239030/django-generic-relations-error-cannot-resolve-keyword-content-object-into-fi) können Sie eine Antwort haben, wenn Ihr Problem mit ist Filtern von Objekten ... Sorry, ich kann nicht helfen mehr –

+0

Nein, tut mir leid, mein Problem ist nicht mit dem Filtern. Es ist mit dem Abrufen des generischen Objekts. –

1

ich es nicht überall in der Dokumentation sehen gerade jetzt, aber wenn Sie an der Quelle sucht GenericRelation gibt es Schlüsselwörter für content_type_field und object_id_field, wenn Sie es schaffen . Also, wenn Sie die Beziehung als GenericRelation(object_id_field='resource_id', content_type_field='resource_type') erstellen, dann sollte es nach den richtigen Feldern suchen.

Ich fand dies besonders notwendig, wenn Sie mehrere GenericForeignKey's in einem einzigen Modell haben und daher nicht die Standardnamen verwenden können.

Sie können die Quelle für 1.11 hier sehen: https://github.com/django/django/blob/stable/1.11.x/django/contrib/contenttypes/fields.py#L291