Обновление данных в связанных моделях
Вот моя модель пользователя,
class User(AbstractBaseUser, PermissionsMixin, Base):
user_id = models.AutoField(primary_key=True)
email = models.EmailField(db_index=True, max_length=100, unique=True)
is_advisor = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
А вот профиль пользователя
class UserProfile(Base):
profile_id = models.AutoField(primary_key=True)
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='user_profile')
first_name = models.CharField(null=True, blank=True, max_length=100)
last_name = models.CharField(null=True, blank=True, max_length=100)
thumbnail = models.ImageField()
Вот маршрутизаторы,
router.register(r'user', UserViewSet),
router.register(r'user/profile', UserProfileViewSet, basename='UserProfile')
Каким будет путь для обновления профиля для конкретного пользователя, скажем user_id 3. Я новичок в django.
Это зависит от lookup_field
, который вы установите на представлении UserProfileViewSet
, которое как документировано :
.
lookup_field
- Поле модели, которое должно использоваться для выполнения поиска объектов отдельных экземпляров модели
Если вы хотите обновить его на основе связанного поля
UserProfile.user
, используя первичный ключ другой моделиUser.user_id
, то:class UserProfileViewSet(viewsets.ModelViewSet): queryset = UserProfile.objects.all() serializer_class = UserProfileSerializer lookup_field = 'user' # Or "user_id"
URL путь будет таким:
http://127.0.0.1:8000/my_app/user/profile/123/
Где
123
являетсяuser_id
пользователем.Если вы хотите обновить его на основе связанного поля
UserProfile.user
, но используя другое поле в связанной таблице, например,User.username
(просто для примера, допустим, что оно есть в вашей моделиUser
и является уникальным)class UserProfileViewSet(viewsets.ModelViewSet): queryset = UserProfile.objects.all() serializer_class = UserProfileSerializer lookup_field = 'user__username'
URL путь будет таким:
http://127.0.0.1:8000/my_app/user/profile/john_lennon/
Где
john_lennon
являетсяusername
пользователем.
Для вашего рассмотрения. Если вы хотите, чтобы id был согласован между User
и UserProfile
таким образом, что user_id
просто эквивалентен profile_id
, вы можете рассмотреть возможность просто сделать его первичным ключом вашего UserProfile
class UserProfile(Base):
profile_id = models.OneToOneField(User, on_delete=models.CASCADE, related_name='user_profile', primary_key=True)
...
Таким образом, ваш lookup_field
может быть просто profile_id
, так как это просто эквивалентно user_id
.