Возможно ли иметь две связи ManyToMany с одной моделью на одной странице администратора? - PullRequest
0 голосов
/ 24 октября 2018

Я моделирую тест и связанные с ним вопросы следующим образом:

# models
class Question(models.Model):
    title = models.TextField()
    category = models.TextField()


class Quiz(models.Model):
    questions = models.ManyToManyField(Question, through='OrderedQuestion')


class OrderedQuestion(models.Model):
    # A through table to allow ordering of questions
    question = models.ForeignKey(Question, ...)
    quiz = models.ForeignKey(Quiz, ...)
    order = models.PositiveIntegerField(default=0)

У меня есть два типа вопросов, которые обрабатываются прокси-моделями:

# proxy models to handle specific question categories
class BoatQuestion(Question):
     objects = BoatQuestionManager()  # handles setting category

     class Meta:
         proxy = True

и аналогичный дляCarQuestion.

Я хочу иметь возможность редактировать BoatQuestions и CarQuestions независимо друг от друга, но на одной и той же странице администратора.Настройки администратора:

class BoatQuestionInline(admin.TabularInline):
    model = BoatQuestion.quiz.through


class CarQuestionInline(admin.TabularInline):
    model = CarQuestion.quiz.through


class QuizAdmin(admin.ModelAdmin):
    model = Quiz
    inlines = (BoatQuestionInline, CarQuestionInline)

, но всякий раз, когда я меняю вопросы в разделе вопросов по лодке, вопросы в разделе автомобилей обновляются, чтобы соответствовать ему, и наоборот.

Есть ли способпоказать их на той же странице администратора, но изменить их независимо?

1 Ответ

0 голосов
/ 24 октября 2018

Проблема в ваших строчках.Вы используете одну и ту же модель для обоих, и это нормально.Но так как вы хотите показать только определенные Question s, вы должны отрегулировать QuerySet для каждого inline и добавить соответствующий .filter().(Я догадываюсь здесь, как вы различаете категорию вопросов.)

class BoatQuestionInline(admin.TabularInline):
    model = BoatQuestion.quiz.through

    def get_queryset(self, *args, **kwargs):
        return OrderedQuestion.objects.filter(question__category='boat')


class CarQuestionInline(admin.TabularInline):
    model = CarQuestion.quiz.through

    def get_queryset(self, *args, **kwargs):
        return OrderedQuestion.objects.filter(question__category='car')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...