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)