Структурирование Джанго Отношения ко многим ко многим - PullRequest
2 голосов
/ 21 октября 2010

При написании заявки для школьного комитета по ежегодникам я зашел в тупик с моделированием конкретных отношений. На данный момент у меня есть фото класс

class Photo(models.Model):
 photo = models.ImageField(upload_to="user_photos/")
 name = models.CharField(blank=True, max_length=50)

 rating = models.IntegerField(default=1000)

 wins = models.IntegerField(default=0)
 matches = models.IntegerField(default=0)

и пользовательский класс

class UserProfile(models.Model):
 user = models.ForeignKey(User, unique=True)
 group = models.CharField(max_length=50)

оба из которых работают плавно. Я хотел бы разбить его так, чтобы у Фотографии была глобальная оценка, полученная из голосов всей пользовательской базы, а также оценка, основанная только на голосах пользователей за эту фотографию. К сожалению, я не знаю, как это структурировать. Моей первой мыслью было месторождение ManyToMany, но я также думал, что что-то вроде разбивки рейтинга на его собственную модель, например:

class Rating(models.Model)
     photo = models.ManyToOne(Photo)
     rating = models.IntegerField(default=1500)

может работать.

Может ли Джанго (или, на самом деле, любой, кто немного компетентен, потому что я знаю, что я не так), гуру, указать мне правильное направление при приближении к этой простой головоломке?

Ответы [ 4 ]

2 голосов
/ 21 октября 2010

Вы хотите через таблицу .

1 голос
/ 21 октября 2010

вы хотите иметь поле «многие ко многим», но пользовательское определение.

class Rating(models.Model):
    photo = models.ForeignKey(Photo)
    user = models.ForeignKey(User)
    rating = models.IntegerField(default=1500)

class Photo(models.Model):
    photo = models.ImageField(upload_to="user_photos/")
    name = models.CharField(blank=True, max_length=50)

    rating = models.ManyToManyField(User, through='Rating')

    wins = models.IntegerField(default=0)
    matches = models.IntegerField(default=0)

вы можете запросить его либо с фото-объектом, либо с пользовательским объектом.

Этоподход наивен и не будет хорошо масштабироваться.На очень популярном веб-сайте модель рейтинга будет перегружена запросами.Что сделал бы более профессиональный веб-сайт, так это денормализовал бы зависимость, введя избыточное целочисленное поле, такое как rating_total, и настроив задание cron для его периодического обновления, чтобы вам не нужно было строить запрос через отношение многие ко многимно сразу получи результат с поля.

0 голосов
/ 21 октября 2010

Я плохо понимаю это предложение: «Фотография будет иметь глобальный рейтинг, полученный на основе голосов всей пользовательской базы, а также рейтинг, основанный только на голосах пользователей на этом фото».

Но если вы имеете в виду, что вы хотите создать рейтинг поля, в котором у вас есть сумма рейтинга всех пользователей, а также сохранить еще один, который содержит рейтинг пользовательских фотографий;Вы должны сначала подумать, стоит ли это того, потому что для вычисляемых полей у вас есть выбор между физическим хранением (глобальной скоростью) таких значений в базе данных или их вычислением по мере необходимости.Вы должны принять решение, основываясь на том, как часто требуется вычисленное значение и сколько информации требуется для его вычисления.

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

0 голосов
/ 21 октября 2010

Я не совсем понимаю ваш вопрос, но для представления отношения многие к одному в django вы используете поле ForeignKey ! Но, как уже указывал Игнасио, отношение «многие ко многим» с промежуточной моделью также может быть полезным для вас!

...