Как сохранить поле модели, имеющее отношения "многие ко многим" с другой моделью, чтобы оно автоматически обновляло значение в другой модели?

У меня есть модель с именем 'tag', которая имеет поле с именем talent, которое имеет поле отношения многие ко многим с моделью с именем 'talent'. теперь я хочу обновить поле talent и сохранить его, и оно должно обновить поле tag модели talent. Я новичок в django. Пожалуйста, помогите мне найти решение для этого.

вот код: tag.py

from django.db import models

from django.utils.translation import gettext as _
from fotoleybend.mixin import (
IsActiveAndVerifiedMixin,
PrimaryKeyMixin,
TimeStampMixin,
)
from talent.models.talent import Talent


class Tag(PrimaryKeyMixin, TimeStampMixin, IsActiveAndVerifiedMixin):
"""Tag model"""

tag = models.CharField(unique=True, max_length=105, db_index=True)
talents = models.ManyToManyField(
    "talent.Talent",
    blank=True,
    verbose_name=_("Tag Talents"),
    related_name="tag_talents",
)

class Meta:
    ordering = ["tag"]

def __str__(self):
    return self.tag

talent.py

from django.db import models

from django.utils.translation import gettext as _
from fotoleybend.mixin import (
IsActiveAndVerifiedMixin,
PrimaryKeyMixin,
TimeStampMixin,
)


class Talent(PrimaryKeyMixin, TimeStampMixin, IsActiveAndVerifiedMixin):
"""Talent model"""

talent = models.CharField(unique=True, max_length=155, db_index=True)
is_primary = models.BooleanField(
    verbose_name=_("Primary"), default=True, db_index=True
)
tags = models.ManyToManyField(
    "talent.Tag",
    blank=True,
    verbose_name=_("Talent Tags"),
    related_name="talent_tags",
)

class Meta:
    ordering = ["talent", "is_primary"]

def __str__(self):
    return self.talent

При выполнении операции set или add на ManyToManyFields, Django не будет обновлять вложенные объекты, вместо этого он будет обновлять "сквозную" таблицу, которая хранит M2M отношения между вашими двумя моделями, которая использует только id. Поэтому он обновляет все идентификаторы в этой таблице, чтобы она соответствовала вашему набору данных.

Если вы хотите обновить определенный тег из Talent (или наоборот), вы можете просто сохранить непосредственно нужную модель:

tag1 = Tag.objects.create(tag='tag1')
tag2 = Tag.objects.create(tag='anothertag')
talent = Talent.objects.create(talent='flying')
tag1.tag = "modified tag1"
tag2.tag = "modified tag2"
# Setting tags, but unsaved
talent.tags.set([tag1, tag2])
talent.tags.all()
<QuerySet [<Tag: anothertag>, <Tag: tag1>]>
# Saving the tag before
talent.tags.all()
tag2.save()
<QuerySet [<Tag: modified tag2>, <Tag: tag1>]>
Вернуться на верх