【问题标题】:Django filtering if multiple foreign key return , display only first foreign key dataDjango过滤如果多个外键返回,只显示第一个外键数据
【发布时间】:2022-01-27 07:12:57
【问题描述】:

我想通过 ID 获取所有 qbank、qset 匹配的 quizArchive。 但仅限于用户首次创建的那些模型。

我有这个模型:

class QuizArchive(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="quizarchive")
    questionset = models.ForeignKey(
        "qbank.QuestionSet", on_delete=models.CASCADE, related_name="qarchive"
    )
    qbank = models.ForeignKey(
        "qbank.QuestionBank",
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        related_name="qbank",
    )
    wrong = models.ManyToManyField(Question, related_name="qarchivew", blank=True)
    skipped = models.ManyToManyField(Question, related_name="qarchivesk", blank=True)
    right = models.ManyToManyField(Question, related_name="qarchiver", blank=True)
    selected_answer = models.JSONField(blank=True, null=True)
    created_time = models.DateTimeField(auto_now_add=True)
    updated_time = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.user} takes {self.questionset}"

序列化代码:

class LeaderboardSerializer(serializers.ModelSerializer):
    class Meta:
        model = QuizArchive
        fields = ["user", "wrong", "right", "skipped", "updated_time","questionset"]
    
    def to_representation(self,instance):
        leaderboard = super().to_representation(instance)
        return leaderboard

API 代码:

class QSetLeaderBoard(views.APIView):
    permission_classes = [AllowAny,]
    def get(self,request,*args, **kwargs):
        qset = QuestionSet.objects.filter(id=int(kwargs.get("qset"))).first()
        qbank = QuestionBank.objects.filter(id=int(kwargs.get("qbank"))).first()
        qarchive = QuizArchive.objects.filter(qbank=qbank,questionset=qset)
        serializer = LeaderboardSerializer(qarchive,many=True)
        data = serializer.data
        return Response(data)

结果:

[
    {
        "user": 1,
        "wrong": [],
        "right": [],
        "skipped": [
            1
        ],
        "updated_time": "2022-01-26T12:44:12.055967Z",
        "questionset": 1
    },
    {
        "user": 2,
        "wrong": [
            1
        ],
        "right": [],
        "skipped": [],
        "updated_time": "2022-01-26T13:00:27.761721Z",
        "questionset": 1
    },
    {
        "user": 1,
        "wrong": [
            1
        ],
        "right": [],
        "skipped": [],
        "updated_time": "2022-01-26T12:58:52.798367Z",
        "questionset": 1
    },
    {
        "user": 2,
        "wrong": [],
        "right": [
            1
        ],
        "skipped": [],
        "updated_time": "2022-01-26T13:00:47.148016Z",
        "questionset": 1
    }
]

但我只想通过 updated_time 字段来唯一用户及其第一个 quizarchive 数据,如下所示:

[
    {
        "user": 1,
        "wrong": [],
        "right": [],
        "skipped": [
            1
        ],
        "updated_time": "2022-01-26T12:44:12.055967Z",
        "questionset": 1
    },
    {
        "user": 2,
        "wrong": [
            1
        ],
        "right": [],
        "skipped": [],
        "updated_time": "2022-01-26T13:00:27.761721Z",
        "questionset": 1
    }
]

SO 按唯一用户过滤并首先创建了测验存档。这可能吗?

【问题讨论】:

    标签: django api rest django-rest-framework django-filter


    【解决方案1】:

    ? 可以使用QuerySet.distinct() 方法过滤唯一值: Django docs

    【讨论】:

      【解决方案2】:

      您可以尝试按以下方式分组:

      qarchive = QuizArchive.objects.filter(qbank=qbank,questionset=qset)
                   .order_by("user").value("user")
      

      【讨论】:

      • 请解释一下,它也不起作用。如果我缺少要添加的内容?我只想要数组列表的唯一用户。不仅仅是订购。
      猜你喜欢
      • 2011-03-06
      • 2015-02-07
      • 2018-08-28
      • 2021-07-27
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      相关资源
      最近更新 更多