首页 > 解决方案 > 检查 Django 中是否存在具有 id 和 manytomany 字段的匹配对象

问题描述

我有如下所示的模型:

class Product(AdcBaseModel):
    file_id = models.CharField(max_length=256, null=True, blank=True)
    channels = models.ManyToManyField(Channel, blank=True)

在此模型中创建新条目时,我想检查是否已存在具有给定 file_id 和通道的条目。

例如。假设我在 Product 中有条目(注意:channels 是 ManytoMany 字段):

id      file_id         channels

1       ID_1            [11,12]
2       ID_2            [13,14]
2       ID_2            [15,16]

现在,如果我再次输入值 iof file_id 作为 ID_2 和通道作为 [15,16]。然后它应该检查这个条目是否已经存在。

对于 file_id 我可以做这样的事情:

Product.objects.filter(file_id="ID_2").exists()

我可以通过什么方式以相同的方式检查 ManytoMany 字段?

标签: djangodjango-modelsorm

解决方案


您可以过滤由 django 创建的直通模型以形成 M2M。

例如,我有一个具有 M2M 关系的模型;

class Leaderboard(models.Model):
    """
    Leaderboard model
    """

    events = models.ManyToManyField(
        verbose_name=_('events'),
        to='entry.Event',
        related_name='leaderboards'
    )

Event模型上是一个模型的链接Client,所以有一种情况是我们想找到Client与 a 关联的,Leaderboard所以使用以下查询;

    qs = leaderboard.events.through.objects.filter(
        leaderboard=leaderboard
    ).select_related(
        'event__client'
    )

因此,如果您这样做Product.channels.through.objects.filter()了,您应该能够进行您熟悉的那种过滤。该表将有through2 列用于这些 FK 关系。product_idchannel_id


推荐阅读