Django-如何检查模型实例是否具有唯一的一对多和多对多关系

时间:2018-08-09 13:16:24

标签: 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=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)

我正在做一些测量,这些测量会基于featuresfiltersmodeltrainset产生计算的预测。这些共同构成了algorithm 前四个正在通过开发过程进行更改,因此,我想将每个度量保存为algorithm版本。

问题

如果我不关心数据冗余和数据库表规范化,则可以创建一个不同但相同的测量算法。但是因为我关心冗余和规范化,所以我想检查一下是否存在具有一对多和多对多的算法。如果实例存在,请使用该实例,否则请创建一个新实例。

每次测量后,计算结果的服务器都会以以下形式向我的django服务器发送JSON:

{
    "filters": ["filter1", "filter2"],
    "model": "model-1",
    "features":["feature1", "feature2"],
    "trainset": "trainset1"
}

问题是我无法找到一种方法来检查algorithm是否已经存在及其所有关系。 找出algorithm是否已经存在的最简单方法是什么?

更新1

我尝试了Mohammad Ali的回答,但部分有效。 当算法表为空并且我使用以下数据时:

{
    "filters": ["filter1", "filter2"],
    "model": "model-1",
    "features":["feature1", "feature2"],
    "trainset": "trainset1"
}

它显然找到零行。 然后,我用数据更新表,然后进行相同的查询。然后它将找到包含较高数据的行。

但是随后我用以下数据提出了新的要求(过滤器和功能与以前不同)。

{
    "filters": ["filter1", "filter3"],
    "model": "model-1",
    "features":["feature1", "feature3"],
    "trainset": "trainset1"
}

我得到与以前相同的算法。为什么会这样?

2 个答案:

答案 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)

因此,如果存在查询,则表示存在算法或创建新的算法