正如标题所说,我正在尝试实现get_or_create
能够获取或创建through
模型实例的方法。
模型:
class Component(models.Model):
name = CharField()
class ConfigComponent(models.Model):
config = models.ForeignKey(Config)
component = models.ForeignKey(Component)
quantity = models.PositiveIntegerField()
class Config(models.Model):
components = models.ManyToManyField(Component, through="ConfigComponent")
因此,基本上我想检查是否Config
存在匹配的输入数据,如果存在则使用它。否则 - 创建一个新的。但如何考虑quantity
每个Component
?找到确切的组件数量并不是什么大问题Config
,但可能看起来组件匹配但数量不同。
def get_or_create(
self,
components: list[tuple[Component, int]]
) -> tuple[Config, bool]:
component_names = [component[0] for component in components]
components_count = len(components)
configs_match = Config.objects.annotate(
total_components=Count('components'),
matching_components=Count(
'components',
filter=Q(components__in=component_names)
))\
.filter(
total_components=components_count,
matching_components=components_count
)
使用:
这将寻找完全匹配,因为s 需要具有与
Config
相同的数量,并且这也应该适用于中的所有。components
len(my_components)
components
my_components
或者也考虑整数:
包含
my_components
一个二元组列表,其中第一项为Component
,第二项为相应的数量。