1

У меня есть 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(...)

+0

Это именно то, что [общие отношения] (https://docs.djangoproject.com/en/1.10/ref/contrib/contenttypes/#generic-relations) для. –

ответ

1

Если вы разрабатываете это. Тогда будет разумно использовать GenericForeignKey, предоставленный Django.

Generic Foreign Key Django

Смежные вопросы