Не получать данные внешнего ключа в представлениях django api - PullRequest
0 голосов
/ 14 октября 2018

В настоящее время у меня есть сайт, и я хочу, чтобы пользователь мог просматривать понравившиеся ему статьи.Я хочу, чтобы это было включено в представление API пользователя, которое уже настроено.Я попробовал tracks = serializers.StringRelatedField(many=True), который есть в документации по drf, но это не сработало.Я также попробовал следующее:

    from rest_framework import serializers

from articles.models import Article, CustomUser,FavoriteArticles


class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ('title', 'content')
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomUser
        fields = '__all__'

class FavoriteArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = FavoriteArticles
        fields = '__all__'

class UserProfileSerializer(serializers.ModelSerializer):
    fav_title = FavoriteArticleSerializer(read_only=False)
    class Meta:
        model = CustomUser
        fields = 'username, git, email, fav_article, fav_title, homepage'

и мои модели:

from django.db import models
# users/models.py
from django.contrib.auth.models import AbstractUser
from django.db.models.signals import post_save
from django.dispatch import receiver
import uuid



class ProgrammingLanguage(models.Model):
    programming_language = models.CharField(max_length=120, null=False, primary_key=True, default="React")

    def __str__(self):
        return self.programming_language

class Article(models.Model):
    title = models.CharField(max_length=25, primary_key=True)
    content = models.TextField()
    usedfor = models.TextField()
    url=models.CharField(max_length=200, null=True)
    article_programming_language = models.ForeignKey(ProgrammingLanguage, on_delete=models.CASCADE, related_name="article_programming_language", default="react")
    score = models.IntegerField(max_length=5, null=0)

    def __str__(self):
        return self.title

class CustomUser(AbstractUser):
    username = models.CharField(max_length=50, unique=True, primary_key=True)
    git = models.CharField(max_length=200, null=True)
    homepage = models.CharField(max_length=250, null=True)
    user_programming_language = models.ForeignKey(ProgrammingLanguage, on_delete=models.CASCADE, related_name="most_used_programming_language", default="react")
    def __str__(self):
        return str(self.username)


class FavoriteArticles(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    fav_title = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='fav_title')
    reasons_liked = models.CharField(max_length=120, null=True)
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name="user", default="tom" )
    def __unicode__(self):
        return '%s: %s' % (self.fav_title, self.reasons_liked)

1 Ответ

0 голосов
/ 14 октября 2018

Я думаю, вы неправильно поняли, что означает related_name.Он определяет, как вы будете обращаться к модели из ее обратной связи.Поэтому я бы порекомендовал вам удалить его из полей вашей FavoriteArticles модели и использовать уже предоставленные по умолчанию Django (в данном случае favoritearticles_set):

class FavoriteArticles(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    fav_title = models.ForeignKey(Article, on_delete=models.CASCADE)
    reasons_liked = models.CharField(max_length=120, null=True)
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, default="tom")

    def __unicode__(self):
        return '%s: %s' % (self.fav_title, self.reasons_liked)

Таким образом, вы можете получить доступ к избранным статьямпользователь через my_user.favoritearticles_set.all().Затем вы можете изменить UserSerializer на поле liked_articles, которое заполняется из обратной связи favoritearticles_set для пользователя FavoriteArticles с использованием атрибута source:

class UserSerializer(serializers.ModelSerializer):
    liked_articles = FavoriteArticleSerializer(source='favoritearticles_set', many=True, read_only=True)

    class Meta:
        model = CustomUser
        # explicitly include other fields as required
        fields = ('username', 'git', 'user_programming_language', 'liked_articles')

Обратите внимание, что мы сделали это поле read_only, поэтому оно будет заполняться только при выполнении запроса GET.

...