Как работать с внешними ключами из другого микросервиса?
У меня есть 2 микросервиса: один для предметов и один для вопросов. Не спрашивайте меня почему. Это должно быть так. Итак, в вопросах у меня есть эта m2m-подобная модель:
class QuestionsSubjects(models.Model):
question = models.ForeignKey(Question, ...)
subject_id = models.PositiveIntegerField()
А модель вопроса имеет такое свойство:
@property
def subjects(self) -> QuerySet[int]:
return QuestionsSubjects.objects \
.filter(question=self).values_list('subject_id', flat=True)
У меня нет модели предмета, есть только идентификаторы, поступающие из фронтенда. Мне нужно хранить отношения между вопросами и темами. Но то, что я имею сейчас, не удобно, потому что трудно создавать вопросы с предметами.
Например, у меня есть этот QuestionSerializer:
class QuestionSerializer(serializers.ModelSerializer):
subjects = serializers.ListField(child=serializers.IntegerField())
class Meta:
model = Question
fields = [
# some other question fields
'subjects',
]
def create(self, validated_data: dict[str, Any]) -> Question:
subject_ids: list[int] = validated_data.pop('subjects', [])
question = Question.objects.create(**validated_data)
create_questions_subjects(question, subject_ids)
return question
def update(self, question: Question, validated_data: dict[str, Any]) -> Question:
# delete all existing rows for specific question
QuestionsSubjects.objects.filter(question=question).delete()
# and recreate them with new subject ids
subject_ids: list[int] = validated_data.pop('subjects', [])
create_questions_subjects(question, subject_ids)
return super().update(question, validated_data)
Проблема в том, что я получаю идентификаторы предметов от клиента и каждый раз мне нужно перебирать идентификаторы каждого предмета и создавать строку в QuestionsDirections для каждого предмета с определенным вопросом. Поэтому я создал функцию под названием create_questions_subjects:
def create_questions_subjects(
question: Question,
subject_ids: list[int]
) -> None:
questions_subjects_list: list[QuestionsSubjects] = []
for id in subject_ids:
questions_subjects_list.append(
QuestionsSubjects(question=question, subject_id=id)
)
QuestionsSubjects.objects.bulk_create(questions_subjects_list)
Но я не знаю, куда я должен его поместить. Он все еще находится в serializers.py. Это работает, но выглядит так уродливо. Есть ли лучший способ решения такой задачи?