Ich habe ein Comment
Modell, das ich seit dem News
Modell:Django dynamisch einen Fremdschlüssel Beziehung Modell wählen
class Comment(models.Model):
news = models.ForeignKey(News, on_delete=models.CASCADE)
posted_by = models.ForeignKey(Student, on_delete=models.CASCADE)
content = models.TextField(max_length=2048)
posted_on = models.DateTimeField(auto_now_add=True)
edited = models.BooleanField(default=False)
last_edited_on = models.DateTimeField(auto_now=True)
def __str__(self):
return '{} - {}'.format(self.posted_by, self.news)
Aber jetzt habe ich ein Materials
Modell und ich möchte Kommentare zu dort haben, aber das gleiche Comments
Modell zu verwenden. Gibt es eine Möglichkeit, die Fremdschlüsselbeziehung dynamisch zu wählen (news = models.ForeignKey(...)
->news_or_material = ...
oder so ähnlich).
Natürlich kann ich ein separates Modell (MaterialComment
) schreiben, aber ich möchte meinen Code wiederverwenden.
Da ist in meinem Viewset sollte ich so etwas tun (ich benutze Django REST Framework):
def create(self, request, news_pk=None):
news = get_object_or_404(News, id=news_pk)
context = {'request': request, 'news': news}
serializer = self.get_serializer_class()(
context=context, data=request.data
)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(
serializer.validated_data,
status=status.HTTP_201_CREATED,
headers=headers
)
I news_pk
Parameter aus der URL zu einem pk
von News
oder Material
bzw. news_or_material = get_object_or_404(...)
ist genau das, was [generische Beziehungen] (https://docs.djangoproject.com/en/1.10/ref/contrib/contenttypes/#generic-relations) sind für. –