Как можно упростить получение соответствующих объектов внешнего ключа
Я использую 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,)