Как можно упростить получение соответствующих объектов внешнего ключа

Я использую Django на бэкенде и React на фронтенде. У меня есть кавычки, которые связаны с символом по внешнему ключу, например:

class Quotes(models.Model):
    quote = models.CharField(max_length=1000, unique=True, null=True, blank=False)
    quote_ja = models.CharField(max_length=1000, unique=True, null=True, blank=True)
    quote_by = models.ForeignKey(Characters, on_delete=models.SET_NULL, null=True, blank=True)
    quote_from = models.ForeignKey(Media, on_delete=models.SET_NULL, null=True, blank=True)
    date_added = models.DateField(auto_now=True)

У меня есть некоторые модели с несколькими внешними ключами, например, в приведенной выше, quote_by возвращает ключи к соответствующим символам.

изображение внешних ключей в api

Это модель символов, подключенная к quote_by:

class Characters(models.Model):
    first_name = models.CharField(max_length=100, null=True, blank=False)
    last_name = models.CharField(max_length=100, null=True, blank=True)
    ja_name = models.CharField(max_length=100, null=True, blank=True)
    image = models.ImageField(upload_to='characters/', null=True, blank=True)

Я хотел бы получить доступ к данным из таких полей, как quote_by/quote_from с помощью React. На данный момент это кажется слишком сложным, и я думаю, стоит ли вносить изменения в бэкенд.

Насколько я понимаю, вы получаете IDs как Integer, вместо этого вы хотели, чтобы их связанные поля, такие как first_name и last_name из Characters модели были вызываемы из Quotes.

Здесь вам не нужно модифицировать свои модели, однако вы можете добиться этого с помощью сериализаторов. Вы можете определить поля в QuoteSerializer следующим образом:

# that will populate the first_name from this related object. 
char_name = serializers.StringRelatedField(source='quote_by.first_name', read_only=True, many=False)

Иногда StringRelatedField становится немного сложным. Вы также можете определить это как что-то вроде этого.

char_name = serializers.CharField(source='quote_by.first_name', read_only=True,)

Если вы действительно хотите поместить логику в модели, то вы можете создать другое поле, используя декоратор @property. Это не создаст таблицу в базе данных для этого конкретного поля. Но может быть использовано в любой момент, когда вы его вызовете.

@property Также известны как "управляемые атрибуты", и являются особенностью Python начиная с версии 2.2. Это изящный способ реализации атрибутов. использование которого напоминает доступ к атрибутам, но реализация которого использует вызовы методов. Source

Например:

class Quotes(models.Model):
    # ....
    @property
    def char_name(self):
        return self.quote_by.first_name + '' + self.quote_by.last_name

Теперь вы просто получаете char_name в сериализаторе, определив его следующим образом:

char_name =  serializers.CharField(read_only=True,)
Вернуться на верх