Обновление данных в связанных моделях

Вот моя модель пользователя,

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 - Поле модели, которое должно использоваться для выполнения поиска объектов отдельных экземпляров модели

.
  1. Если вы хотите обновить его на основе связанного поля 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 пользователем.

  2. Если вы хотите обновить его на основе связанного поля 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.

Вернуться на верх