У меня есть Comment
модели, которую я использую для News
модели:Django динамически выбирать внешний ключ реляционной модели
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)
Но теперь у меня есть Materials
модели, и я хочу, чтобы иметь комментарии там тоже, но использовать ту же модель Comments
. Есть ли способ динамически выбирать отношение внешнего ключа (news = models.ForeignKey(...)
->news_or_material = ...
или что-то в этом роде).
Конечно, я могу написать отдельную модель (MaterialComment
), но я хочу повторно использовать свой код.
Тогда в моем режиме просмотра я должен сделать что-то вроде этого (я использую 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
)
Мне нужно, чтобы включить news_pk
параметр из URL к pk
из News
или Material
и соответственно news_or_material = get_object_or_404(...)
Это именно то, что [общие отношения] (https://docs.djangoproject.com/en/1.10/ref/contrib/contenttypes/#generic-relations) для. –