Как работать с внешними ключами из другого микросервиса?

У меня есть 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. Это работает, но выглядит так уродливо. Есть ли лучший способ решения такой задачи?

Вернуться на верх