Можно ли использовать аргумент ключевого слова из другого приложения для соединения 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')),
]
Это мой первый раз, когда я пишу веб-приложение любого рода, поэтому, пожалуйста, не ругайте меня слишком сильно. Я буду благодарен за любую помощь в решении моей основной проблемы, а также за любые указания/советы по лучшей практике в разработке веб-приложений.
Заранее всем спасибо!