【发布时间】:2021-09-11 19:46:59
【问题描述】:
我有一个 API,我将 DRF 与基于类的视图一起使用。
我的 API 有这些模型:
""" 系统模型"""
import uuid
from django.db import models
from django.utils.translation import ugettext as _
from simple_history.models import HistoricalRecords
from common_config import custom_model_fields as version_model
from systems.models.manager.manager import SystemManager
class System(models.Model):
""" Define fields for system model.
machine(1-1): machine/models/machine.py
owner(N-N): user/models/user.py
support(N-N): user/models/user.py
dealer(1-N): user/models/company.py
console(1-1): console/models/console.py
vision(1-N): vision/models/vision.py
"""
class MarketChoice(models.TextChoices):
""" Enum for market location """
AUSTRALIA = 'Australia', _('Australia')
EUROPE = 'Europe', _('Europe')
class ProductChoice(models.TextChoices):
""" Enum for Product """
SPRAYER = 'Sprayer', _('Sprayer')
OPTICAL_SORTER = 'Optical sorter', _('Optical sorter')
uuid = models.UUIDField(
default=uuid.uuid4,
editable=False,
unique=True)
name = version_model.VersionCharField(
verbose_name=_('Commercial name of the system'),
max_length=30,
default='1',
null=False,
blank=False,
unique=True,
version=1)
code = models.CharField(verbose_name=_('code'), max_length=30, default='')
description = models.TextField(verbose_name=_('Description'), blank=True)
machine = models.OneToOneField('machine.Machine', on_delete=models.PROTECT)
owner = models.ManyToManyField('users.User', related_name='own')
support = models.ManyToManyField('users.User', related_name='support')
dealer = models.ForeignKey('users.Company', on_delete=models.PROTECT)
console = models.OneToOneField('console.Console', on_delete=models.PROTECT, related_name='console')
market_location = models.CharField(max_length=25, choices=MarketChoice.choices, default=MarketChoice.EUROPE)
is_telemetry_available = models.BooleanField(default=True,
verbose_name=_('Is the telemetry activated for this system ?'))
product = models.CharField(verbose_name=_('Product type'), max_length=25, choices=ProductChoice.choices,
default=ProductChoice.SPRAYER)
application = models.CharField(verbose_name=_('Application'), max_length=30, default='')
history = HistoricalRecords()
objects = SystemManager()
class Meta: # pylint: disable=too-few-public-methods
""" Meta class for System """
verbose_name = _('System')
verbose_name_plural = _('Systems')
def __str__(self):
return f'System {self.name}'
""" Model for Calculation module """
import uuid
from django.db import models
from django.utils.translation import ugettext_lazy as _
class Vision(models.Model):
""" Define fields for vision model.
Represent a physical calculation module.
device(1-1): device/models/device.py
we_version(1-N): version/models/version.py
setting(1-N): setting/models/setting.py
camera(N-N): camera/models/camera.py
"""
uuid = models.UUIDField(
default=uuid.uuid4,
editable=False,
unique=True)
device = models.OneToOneField(
'device.Device',
on_delete=models.PROTECT
)
we_version = models.ForeignKey('version.Version', on_delete=models.PROTECT, verbose_name=_('Weed Engine Version'))
we_up_to_date = models.BooleanField(default=True, verbose_name=_('Is Weed Engine up to date'))
we_last_update = models.DateTimeField(verbose_name=_('Weed Engine last update date'))
setting = models.ForeignKey('setting.Setting', on_delete=models.PROTECT,
verbose_name=_('Settings associate to the vision module'), blank=True, null=True)
system_id = models.PositiveSmallIntegerField(verbose_name=_('Id of the vision module on the system'))
camera = models.ManyToManyField('camera.Camera', verbose_name=_('Cameras associated to vision module'))
installation_date = models.DateTimeField(verbose_name=_('Vision installation date on the system'), null=True,
blank=True)
system_parent = models.ForeignKey('systems.System', on_delete=models.SET_NULL, null=True, related_name='vision')
class Meta: # pylint: disable=too-few-public-methods
""" Meta class for Vision """
verbose_name = _('Vision')
verbose_name_plural = _("Visions")
""" Model for Camera """
import uuid
from django.db import models
from django.utils.translation import ugettext_lazy as _
class Camera(models.Model):
""" Define fields for camera model.
Represent a physical camera.
1-1: device/models/device.py
1-N: setting/models/setting.py
"""
uuid = models.UUIDField(
default=uuid.uuid4,
editable=False,
unique=True)
system_id = models.PositiveSmallIntegerField(verbose_name=_('Id of the vision module on the system'))
installation_date = models.DateTimeField(verbose_name=_('Camera installation date on the system'), null=True,
blank=True)
hardware = models.OneToOneField(
'device.Hardware',
on_delete=models.PROTECT
)
setting = models.ForeignKey('setting.Setting', on_delete=models.PROTECT,
verbose_name=_('Settings associate to the vision module'), null=True, blank=True)
class Meta: # pylint: disable=too-few-public-methods
""" Meta class for Camera """
verbose_name = _('Camera')
verbose_name_plural = _("Cameras")
系统、视觉和相机是 3 个不同的应用程序。
我的 API 正在与 SPA 通信。
对于特定的已知系统,SPA 需要获取数据:
const cameras = [
{name:"206", module:"206"},
{name:"204", module:"204"},
{name:"202", module:"202"},
{name:"201", module:"201"},
{name:"203", module:"203"},
{name:"205", module:"203"},
];
该常量是出于某种测试原因创建的,“name”键对应于相机的名称,“module”对应于模块的名称。
我想知道我是否应该在系统、视觉或相机上创建我的视图?无论如何,我考虑过过滤系统名称/uuid。
另外,无论我将视图放在哪个应用程序中,我应该如何重新创建 SPA 需要的结构?我应该创建一个自定义序列化程序并使用它有一个特定的视图吗?我应该直接从我的数据库中返回正确的结构(我最喜欢的选项)吗?我应该在 '/visions-configuration' 这样的 url 上调用我的观点吗?它看起来不是很干净,我不确定它是否会遵守 REST 约定...
任何帮助都会很棒!
谢谢! :D
【问题讨论】:
标签: django api rest django-rest-framework architecture