Edw*_*ams 7 django django-models django-rest-framework
我有一个ManyToMany链接,以及一个链接三个对象的外键.
[A]> - <[B]> --- [C]
A可以属于B的许多,反之亦然.但是,A只能属于具有相同父 C的B对象.
我正在尝试clean()在模型的方法中做一些事情.我正在使用Django Rest Framework,没有ModelForms或类似的东西.我还没弄清楚
简化的示例代码
class Device(models.Model):
name = models.CharField(max_length=20)
projects = models.ManyToManyField(Project, 'devices')
details = models.CharField(max_length=200)
serial = models.CharField(max_length=20)
address models.GenericIPAddressField(default="0.0.0.0")
port = models.IntegerField(default=3000)
jumpers = models.IntegerField(default=0)
install_date = models.DateField(blank=True, null=True)
class Project(models.Model):
name = models.CharField(max_length=20)
description = models.CharField(max_length=250)
area = models.ForeignKey(Area)
class Area(models.Model):
name = models.CharField(max_length=20)
description = models.CharField(max_length=250)
owner = models.CharField(max_length=20) # microservice doesn't have owner group - field in JWT
Run Code Online (Sandbox Code Playgroud)
串行器
class AreaSerializer(serializers.ModelSerializer):
class Meta:
model = Area
fields = ('name', 'description', 'owner')
class ProjectSerializer(serializers.ModelSerializer):
class Meta:
model = Project
fields = ('id', 'name', 'description', 'area')
class DeviceSerializer(serializers.ModelSerializer):
class Meta:
model = Device
fields = ('id', 'name', 'projects', 'details', 'serial',
'address', 'port', 'jumpers', 'install_date')
Run Code Online (Sandbox Code Playgroud)
我不确定您想在哪里以及如何验证您的数据。因此,我只是发布可以根据您的具体检查来验证项目是否可以链接到设备的方法。
def validate_project(device, project):
projects = device.projects.all()
areas = set(projects.values_list('area', flat=True))
if len(areas) > 1:
raise serializers.ValidationError('projects are not valid')
return areas.pop() == project.area_id
Run Code Online (Sandbox Code Playgroud)
编辑:
您必须使用中间模型来存储设备和项目之间的关系。
class Membership(models.Model):
device = models.ForeignKey(Device, on_delete=models.CASCADE)
project = models.ForeignKey(Project, on_delete=models.CASCADE)
area = models.ForeignKey(Area, on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)
使用上面的成员资格模型来存储多对多关系。
在您的设备型号上,使用此字段来定义多对多关系。
projects = models.ManyToManyField(Project, through='Membership')
查看文档
现在,当您链接设备和项目时,您还将显式添加区域 ID。在添加之前,您可以根据关联的区域检查该项目是否有效。
| 归档时间: |
|
| 查看次数: |
589 次 |
| 最近记录: |