Python Django-如何检查模型实例是否具有唯一的一对多和多对多关系 问题:
我有五种型号:Python Django-如何检查模型实例是否具有唯一的一对多和多对多关系 问题:,python,django,django-models,Python,Django,Django Models,我有五种型号: class Features(models.Model): name = models.CharField(max_length=100, unique=True) class Filter(models.Model): name = models.CharField(max_length=100, unique=True) class Model(models.Model): name = models.CharField(max_length=
class Features(models.Model):
name = models.CharField(max_length=100, unique=True)
class Filter(models.Model):
name = models.CharField(max_length=100, unique=True)
class Model(models.Model):
name = models.CharField(max_length=200, unique=True)
class TrainSet(models.Model):
name = models.TextField(unique=True)
class Algorithm(models.Model):
feature = models.ManyToManyField(Features)
filter = models.ManyToManyField(Filter)
model = models.ForeignKey(Model, on_delete=models.DO_NOTHING, null=True)
train_set = models.ForeignKey(TrainSet, on_delete=models.DO_NOTHING, null=True)
我正在进行一些测量,根据特性
、过滤器
、模型
和列车组
生成计算预测。它们一起构成一个算法
前四项在开发过程中发生了变化,因此我想用算法版本保存每个度量值
问题
如果我不关心数据冗余和数据库表规范化,我可以为度量创建一个不同但相同的算法。但是,因为我关心冗余和规范化,我想检查具有一对多和多对多的算法是否已经存在。如果实例存在,则使用该实例,否则创建一个新实例
每次测量后,计算结果的服务器都会以以下形式向我的django服务器发送一个JSON:
{
"filters": ["filter1", "filter2"],
"model": "model-1",
"features":["feature1", "feature2"],
"trainset": "trainset1"
}
问题是,我无法找到一种方法来检查算法是否已经存在及其所有关系。
找出算法是否已经存在的最简单方法是什么?
更新1
我试过穆罕默德·阿里的答案,但部分有效。
当算法表为空且我使用以下数据时:
{
"filters": ["filter1", "filter2"],
"model": "model-1",
"features":["feature1", "feature2"],
"trainset": "trainset1"
}
它显然找不到行。
然后用数据更新表,然后进行相同的查询。然后,它将找到包含较高数据的行
但随后我使用以下数据提出了一个新请求(过滤器和功能与以前不同)
我得到了和以前一样的算法。为什么会这样?您可以使用算法模型上的过滤器来实现,例如:
algorithmList = Algorithm.objects.filter(feature__name__in=['f1', 'f2'], filter__name__in=['fil1', 'fil2'], model__name__in=['m1', 'm2'], train_set__name__in=['t1', 't2'])
if algorithmList.count() == 0:
# do something
通过多次使用过滤器添加条件。您可以循环到所有过滤器和功能,并将其添加到查询中
query = Algorithm.objects.filter(train_set=train_set_obj, model=model_obj)
features = [feature_obj1,feature_obj2]
filters = [filter_obj1,filter_obj2]
for feature in features:
query = query.filter(feature=feature)
for filter in filters:
query = query.filter(filter=filter)
所以,如果查询存在,这意味着算法存在,或者创建一个新的如果我有一个算法,比如说一个算法,这就不起作用了。一个有三个过滤器['a','b','c'],当我试图检查第二个算法是否存在过滤器['a','b'],它会给我第一个算法,这是不正确的。我没有理解你。你的意思是说,如果有两个算法使用过滤器['a','b','c',另一个算法使用过滤器['a','b',],并且你查询过滤器['a','b',],那么这两个算法都应该出现?如果是这样的话,你可以尝试使用Q()操作符进行更复杂的查询。可能的用法是生成或查询。尝试此查询,filter\u query=None for filter in filters:filter\u query=filter\u query | Q(filter=filter query=query.filter(filter\u query)
您可以从这里从django.db导入Q运算符
query = Algorithm.objects.filter(train_set=train_set_obj, model=model_obj)
features = [feature_obj1,feature_obj2]
filters = [filter_obj1,filter_obj2]
for feature in features:
query = query.filter(feature=feature)
for filter in filters:
query = query.filter(filter=filter)