Как добавить поле с его данными из одной модели в другую в Django?
В Django уже есть модель User, которая имеет поле username; у меня также есть модель Profile. Я хочу передать имя пользователя из модели User вместе с полями модели Profile, чтобы я мог получить доступ к имени пользователя из самой модели Profile, так как на фронтенде я возвращаю объект модели Profile
МОДЕЛИ
User= get_user_model()
class Profile(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
id_user = models.IntegerField()
department= models.CharField(max_length=50,blank=True)
degree= models.CharField(max_length=20,blank=True)
year= models.CharField(max_length=20,blank=True)
bio = models.TextField(blank=True)
profileimg= models.TextField(default=DEFAULT_IMAGE_DATA)
def __str__(self):
return self.user.username
SERIALIZER
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields=['id','user', 'id_user', 'department', 'degree', 'year', 'bio','profileimg']
class ChatMsgSerializer(serializers.ModelSerializer):
reciever_profile= ProfileSerializer(read_only=True)
sender_profile= ProfileSerializer(read_only=True)
class Meta:
model = ChatMsg
fields=['id','user', 'sender','sender_profile', 'reciever','reciever_profile', 'msg', 'is_read', 'date']
Одним из решений, о котором я думал, было сделать еще один запрос fetch из frontend и сделать еще одну конечную точку, которая возвращает имя пользователя, но не думаю, что это будет хорошо работать, когда мне нужно имя пользователя и отправителя, и получателя
Вы можете использовать SlugRelatedField
[drf-doc]:
class ProfileSerializer(serializers.ModelSerializer):
user = serializers.SlugRelatedField(slug_field='username', read_only=True)
class Meta:
model = Profile
fields = [
'id',
'user',
'id_user',
'department',
'degree',
'year',
'bio',
'profileimg',
]
Проблема с вашим решением
Вам не нужно настраивать фреймворк. Используйте мощный фреймворк django!
Джангоновское решение
Вы можете получить доступ ко всем user
атрибутам из Profile
записи напрямую! Чтобы получить last_name
пользователя из Profile
записи с именем some_profile
:
- в Python:
some_profile.user.last_name
(django docs) - в запросах:
some_profile__user__last_name
(django docs) - в HTML:
{{ some_profile.user.last_name }}
Рекомендация
Одна рекомендация, вместо ForeignKey
используйте OneToOneField
(django docs). Это похоже на ForeignKey
с unique=True
, что имеет смысл в данном случае, поскольку user
может быть связано только с уникальным Profile
.
class Expert(models.Model):
# Use 'OneToOneField' instead of ForeignKey
user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE)
# The rest is unchanged