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
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 modelsfrom django.contrib.contenttypes.models import ContentTypefrom django.contrib.contenttypes.fields import GenericForeignKeyclass 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