Django фильтрация, если возвращается несколько внешних ключей, отображает только данные первого внешнего ключа
Я хочу получить все викторины, в которых qbank, qset совпадают по ID. Но только те модели, которые пользователь создал впервые.
У меня эта модель:
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 следующим образом:
[
{
"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 фильтруется по уникальному пользователю и впервые созданному quizarchive. Возможно ли это?
вы можете попробовать сгруппировать по:
qarchive = QuizArchive.objects.filter(qbank=qbank,questionset=qset).order_by("user").value("user")
🙌
Фильтрация уникальных значений может быть сделана с помощью метода .distinct() в QuerySet:
Django docs