gpt4 book ai didi

Django ManyToMany 验证约束

转载 作者:行者123 更新时间:2023-12-02 02:23:06 26 4
gpt4 key购买 nike

我有一个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

序列化器

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')

最佳答案

我不确定您想在哪里以及如何验证您的数据。因此,我只是发布可以根据您的具体检查来验证项目是否可以链接到设备的方法。

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

编辑:

您必须使用中间模型来存储设备和项目之间的关系。

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)

使用上面的成员模型来存储多对多关系。

在您的设备型号上使用此字段来定义多对多关系。

projects = models.ManyToManyField(Project, through='Membership')

查看 docs

现在,当您链接设备和项目时,您还将显式添加区域 ID。现在添加之前,您可以根据关联的区域检查项目是否有效。

关于Django ManyToMany 验证约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48554792/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com