我有五个型号:
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)
我正在做一些测量,这些测量会基于features
,filters
,model
和trainset
产生计算的预测。这些共同构成了algorithm
前四个正在通过开发过程进行更改,因此,我想将每个度量保存为algorithm
版本。
如果我不关心数据冗余和数据库表规范化,则可以创建一个不同但相同的测量算法。但是因为我关心冗余和规范化,所以我想检查一下是否存在具有一对多和多对多的算法。如果实例存在,请使用该实例,否则请创建一个新实例。
每次测量后,计算结果的服务器都会以以下形式向我的django服务器发送JSON:
{
"filters": ["filter1", "filter2"],
"model": "model-1",
"features":["feature1", "feature2"],
"trainset": "trainset1"
}
问题是我无法找到一种方法来检查algorithm
是否已经存在及其所有关系。
找出algorithm
是否已经存在的最简单方法是什么?
我尝试了Mohammad Ali的回答,但部分有效。 当算法表为空并且我使用以下数据时:
{
"filters": ["filter1", "filter2"],
"model": "model-1",
"features":["feature1", "feature2"],
"trainset": "trainset1"
}
它显然找到零行。 然后,我用数据更新表,然后进行相同的查询。然后它将找到包含较高数据的行。
但是随后我用以下数据提出了新的要求(过滤器和功能与以前不同)。
{
"filters": ["filter1", "filter3"],
"model": "model-1",
"features":["feature1", "feature3"],
"trainset": "trainset1"
}
我得到与以前相同的算法。为什么会这样?
答案 0 :(得分:0)
您可以使用算法模型上的过滤器进行操作,例如:
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
答案 1 :(得分:0)
您可以通过多次使用过滤器来添加条件。您可以循环访问所有过滤器和功能,并将其添加到查询中
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)
因此,如果存在查询,则表示存在算法或创建新的算法