0 Tage Serie
python / intermediate
Snippet

Django Generische Relationen mit ContentType

Generische Relationen erlauben einem Model sich auf jedes andere Model zu beziehen ohne hardcodierte Foreign Keys. ContentType verfolgt alle Models, und GenericForeignKey löst das Ziel zur Laufzeit dynamisch auf.

snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey
class Comment(models.Model):
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
text = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
# Usage:
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=200)
# Comments can attach to any model:
Comment.objects.create(content_object=author_instance, text='Great author!')
Comment.objects.create(content_object=book_instance, text='Excellent read!')
django
Erklärung
1
ContentType
Spezialmodell das alle Applikationsmodels speichert
2
GenericForeignKey
Verlinkt dynamisch zu beliebigem Model
3
content_object=author_instance
Kommentar zu beliebigem Model hinzufügen ohne Comment-Schema zu ändern