LINUX.ORG.RU

django orm, хочу джойны

 ,


0

2
from django.db import models
from django.contrib.auth.models import User


class Task(models.Model):
    name = models.CharField(max_length=16, null=None, blank=None)
    max_score = models.PositiveIntegerField(null=None, blank=None)

    def __str__(self):
        return '{}{}'.format(self.name, self.max_score)


class Achievement(models.Model):
    task = models.ForeignKey(Task, null=None, blank=None)
    user = models.ForeignKey(User, null=None, blank=None)
    score = models.PositiveIntegerField(null=None, blank=None)

    def __str__(self):
        return '{} achieved {} in {}'.format(self.user, self.score, self.task)

Есть юзеры. Есть список задач.

Юзер выполнят задачу - создаётся новая ачивка «задача, юзер, набранные очки».

Нужно получить для конкретного юзера список «задача: набранные очки». Если ачивки ещё нет, то набранные очки=0.



Последнее исправление: suuaq (всего исправлений: 1)

И какие проблемы просто словарь положить в юзера и не городить огород? Возьми JSONField и не страдай.

Goury ★★★★★
()
Последнее исправление: Goury (всего исправлений: 1)
Ответ на: комментарий от Goury

И какие проблемы просто словарь положить в юзера и не городить огород?

Взаимоисключающие параграфы. Зачем данные, которые прекрасно кладуться в реляционную модель со всеми профитами, пихать в словарь? Придётся потом с ранжированием юзеров трахаться.

suuaq
() автор топика

У тебя странная схема. У каждого юзера может быть несколько ачивок на один Task и нужно посчитать максимальный score/сумму score? Если нет, то почему Task — не many2many к User (в этом случае задача тривиальна)?

x3al ★★★★★
()

Или ты неправильно понимаешь ОРМ и тебе нужно prefetch_related для ачивок, или я неправильно понимаю задачу.

anonymous
()
Ответ на: комментарий от x3al

У каждого юзера может быть несколько ачивок на один Task и нужно посчитать максимальный score/сумму score?

Одна ачивка на таск. Таки это ограничение тоже надо добавить.

Если нет, то почему Task — не many2many к User (в этом случае задача тривиальна)?

Ты о чём? Task вполне себе many2many к User через таблицу ачивок.

Или ты о джанговском ManyToManyField? Планировалось, что юзер может набрать только часть от максимально возможных очков таска, хотя эта фича один фиг не используется, поэтому нужен атрибут score. Ситуация примерно как тут. А ManyToManyField дополнительные атрибуты не поддерживает вроде как.

suuaq
() автор топика
Ответ на: комментарий от x3al

Набросал от балды в SQL

SELECT name, COALESCE(score, 0) as score
FROM myproj_task
LEFT JOIN myproj_achievement
ON myproj_task.name = myproj_achievement.task_id
AND myproj_achievement.user_id = (SELECT id FROM auth_user WHERE username = 'anonymous')

suuaq
() автор топика
Ответ на: комментарий от x3al

Я таки ламер. У ManyToManyField есть параметр through. И в залинкованом вопросе на stackoverflow он есть.

suuaq
() автор топика
Ответ на: комментарий от ggrn

А джанго бук я за тебя буду читать?

Ты даже постановку задачи не осилил, как ты собрался целый бук читать?

Если ачивки ещё нет, то набранные очки=0.

suuaq
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.