Можно ли использовать аргумент ключевого слова из другого приложения для соединения URL-адресов двух разных приложений?

В настоящее время я разрабатываю приложение с использованием Django REST Framework и Vue, в котором люди могут отслеживать сигнальные выходы устройства.

Для некоторого контекста я создал пользовательскую модель пользователя с уникальным идентификатором пользователя UUID4, который будет присваиваться каждому пользователю. Эта модель находится в приложении Django, которое я назвал accounts. Аналогично, сессии записи данных пользователя и связанные с ними данные находятся в отдельных моделях в приложении, которое я назвал studio.

Моя проблема заключается в следующем: Я понял, что хочу связать собранные данные с учетной записью пользователя и любой сессией, к которой он хочет привязать эти данные. Однако, поскольку эти модели находятся в разных приложениях Django, я получаю ошибку get() got an unexpected keyword argument 'user_id' когда я пытаюсь связать URLs приложений account и studio вместе. Соответствующие фрагменты кода приведены ниже:

models.py (in studio)

from django.db import models


class Session(models.Model):
    user_id = models.ForeignKey(
        'accounts.CustomUser', on_delete=models.CASCADE)
    session_id = models.CharField(max_length=100, unique=True, blank=False)

    def get_associated_user_id(self):
        return (f'{self.user_id}')

    def __str__(self):
        return (f"Session ID: {self.session_id}")


class LaserData(models.Model):
    user_id = models.ForeignKey(
        'accounts.CustomUser', on_delete=models.CASCADE)
    session_id = models.ForeignKey('Session', on_delete=models.CASCADE)
    timestamp = models.DateTimeField(auto_now_add=True)
    laser_current = models.DecimalField(max_digits=8, decimal_places=3)
    laser_temperature = models.DecimalField(max_digits=8, decimal_places=3)
    laser_temperature_set = models.DecimalField(max_digits=8, decimal_places=3)
    tec_voltage_positive = models.DecimalField(max_digits=8, decimal_places=3)
    tec_voltage_negative = models.DecimalField(max_digits=8, decimal_places=3)
    tec_voltage_differential = models.DecimalField(
        max_digits=8, decimal_places=3)
    ambient_temperature = models.DecimalField(max_digits=8, decimal_places=3)

    class Meta:
        ordering = ('timestamp',)

    def get_associated_user_id(self):
        return (f'{self.user_id}')

    def get_associated_session_id(self):
        return self.session_id

    def __str__(self):
        return (f"MicroModule data recorded at {self.timestamp}.")

views.py (in studio)

from rest_framework.views import APIView
from rest_framework.response import Response

from django.shortcuts import render
from django.http.response import Http404

from .models import Session, LaserData
from .serializers import SessionSerializer, LaserDataSerializer


class SessionListView(APIView):
    def get(self,  request, u_id, format=None):
        session = Session.objects.get(user_id=u_id)[0:9]
        serializer = SessionSerializer(session, many=True)

        return Response(serializer.data)

    def post(self, request):
        serializer = SessionSerializer(data=request.data)

        if serializer.is_valid():
            serializer.save()

        return Response(serializer.data)


class SessionDetailView(APIView):
    def get_session(self, u_id, s_id):
        try:
            return Session.objects.filter(user_id=u_id).get(session_id=s_id)
        except Session.DoesNotExist:
            raise Http404

    def get(self, request, user_id, session_id, format=None):
        session = self.get_session(user_id, session_id)
        serializer = SessionSerializer(session)

        return Response(serializer.data)


class LaserDataListView(APIView):
    def get(self,  request, u_id, s_id, format=None):
        laser_data = LaserData.objects.get(
            user_id=u_id, session_id=s_id)[0:9]
        serializer = LaserDataSerializer(laser_data, many=True)

        return Response(serializer.data)

    def post(self, request):
        serializer = LaserDataSerializer(data=request.data)

        if serializer.is_valid():
            serializer.save()

        return Response(serializer.data)


class LaserDatumDetailView(APIView):
    def get_datum(self, u_id, s_id, time):
        try:
            return LaserData.objects.get(
                user_id=u_id,
                session_id=s_id,
                timestamp=time
            )
        except LaserData.DoesNotExist:
            raise Http404

    def get(self, request, user_id, session_id, timestamp, format=None):
        laser_datum = self.get_datum(user_id, session_id, timestamp)
        serializer = LaserDataSerializer(laser_datum)

        return Response(serializer.data)

urls.py (in studio)

from django.urls import path, include

from . import views

urlpatterns = [
    path(r'sessions/', views.SessionListView.as_view()),
    path(r'sessions/<str:session_id>/',
         views.SessionDetailView.as_view()),
    path(r'sessions/<str:session_id>/laser-data/',
         views.LaserDataListView.as_view()),
    path(r'sessions/<str:session_id>/laser-data/<str:timestamp>/',
         views.LaserDatumDetailView.as_view()),
]

models.py(in accounts)

views.py (in accounts)


from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authentication, permissions, status

from django.http.response import Http404
from django.contrib.auth import get_user_model

from .serializers import CustomUserSerializer

import uuid

CustomUser = get_user_model()


class CustomUserListView(APIView):
    def get(self, request, format=None):
        custom_users = CustomUser.objects.all()
        serializer = CustomUserSerializer(custom_users, many=True)

        return Response(serializer.data)

    def post(self, request):
        serializer = CustomUserSerializer(data=request.data)

        if serializer.is_valid():
            serializer.save()

            return Response(serializer.data, status=status.HTTP_201_CREATED)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class CustomUserDetailView(APIView):
    def get_user(self, id):
        try:
            return CustomUser.objects.get(user_id=id)
        except CustomUser.DoesNotExist:
            raise Http404

    def get(self, request, user_id, format=None):
        custom_user = self.get_user(user_id)
        serializer = CustomUserSerializer(custom_user)

        return Response(serializer.data)

    def put(self, request, user_id):
        custom_user = self.get_user(user_id)
        serializer = CustomUserSerializer(custom_user, data=request.data)

        if serializer.is_valid():
            serializer.save()

            return Response(serializer.data)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

urls.py (in accounts)

from django.urls import path, include

from . import views

urlpatterns = [
    path(r'accounts/', views.CustomUserListView.as_view()),
    path(r'accounts/<uuid:user_id>/',
         views.CustomUserDetailView.as_view(), name='my-account'),
    path(r'accounts/<uuid:user_id>/', include('studio.urls')),
]

Это мой первый раз, когда я пишу веб-приложение любого рода, поэтому, пожалуйста, не ругайте меня слишком сильно. Я буду благодарен за любую помощь в решении моей основной проблемы, а также за любые указания/советы по лучшей практике в разработке веб-приложений.

Заранее всем спасибо!

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