Django User as foreignKey имеет странное поведение
Я создаю restful API в Django и заметил кое-что довольно странное! Вот моя модель темы:
class Topic(models.Model):
""" Topic base model"""
owner = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=150, blank=False, null=False)
content = models.CharField(max_length=500, blank=False, null=False)
date_added = models.DateTimeField(auto_now_add=True, editable=False)
def __str__(self):
return self.title
А это мой сериализатор:
class TopicSerializer(serializers.ModelSerializer):
"""Serializer for the Topic model"""
user = serializers.ReadOnlyField(source='owner.username')
class Meta:
model = Topic
exclude = ['owner']
extra_kwargs = {'pk': {'read_only': True}, 'owner': {'read_only': True}}
Как вы можете видеть, владелец исключен, но когда я делаю get-запрос /api/topics/1/ на моем Topic ModelViewSet, я получаю:
{"id":1,"user":"Javad","title":"a","content":"b","date_added":"2024-08-25T19:57:00.712475Z"}
А когда я включаю владельца в свой сериализатор, то получаю:
{"id":1,"user":"Javad","title":"a","content":"b","date_added":"2024-08-25T19:57:00.712475Z","owner":"90f8d3d9-08c2-4890-9ba6-3e6f912b10ee"}
Так почему же именно Django добавляет поле "user" в мою модель?
Я полагаю, что это должно быть намеренно и уникально для пользователя Model, верно? Могу ли я контролировать это?
Так почему же именно Django добавляет поле "пользователь" в мою модель?
Потому что вы просите сериализатор сделать это. Вы определили a:
user = serializers.ReadOnlyField(source='owner.username')
Вы можете удалить это с помощью:
class TopicSerializer(serializers.ModelSerializer):
# 🖟 remove
# user = serializers.ReadOnlyField(source='owner.username')
class Meta:
model = Topic
exclude = ['owner']
extra_kwargs = {'pk': {'read_only': True}, 'owner': {'read_only': True}}
Если вы хотите, чтобы в поле указывалось имя пользователя, вы работаете с:
class TopicSerializer(serializers.ModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
class Meta:
model = Topic
exclude = ['owner']
extra_kwargs = {'pk': {'read_only': True}, 'owner': {'read_only': True}}