Улучшение времени выполнения простого запроса - PullRequest
0 голосов
/ 26 ноября 2010

Гуру:

У меня есть очень простая модель данных, связывающая два различных типа User с помощью Interaction:

# myapp/models.py
class C1(models.Model):
 user = models.ForeignKey(User)

class C2(models.Model):
 user = models.ForeignKey(User)

class Interaction(models.Model):
 c1 = models.ForeignKey(C1)
 c2 = models.ForeignKey(C2)
 date = models.DateField()

Итак, InteractionUser класса C1, User класса C2 и даты (в дополнение к первичному ключу, автоматически целое число);у данной пары пользователей может быть много Interaction с.

Я заполнил базу данных 2000 случайными User с (1000 каждый класс), и когда я запрашиваю Interaction, время выполнения слишком медленное(около трех секунд - недопустимо в рабочей среде).

Что я могу сделать, чтобы улучшить время выполнения этого поиска?Должен ли я определить Interaction по-другому?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 26 ноября 2010

Если вы хотите хранить дополнительную информацию, относящуюся к вашим пользователям, Django предоставляет метод для указания связанной с сайтом модели, называемой «профиль пользователя», для этой цели.

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

# settings.py
AUTH_PROFILE_MODULE = 'myapp.UserProfile'

# myapp/models.py
class UserProfile(models.Model):
    CLASS_CHOICES = (
        (0, 'Yellow User'),
        (1, 'Green User'),
    )
    user_class = models.IntegerField(choices=CLASS_CHOICES)
    user = models.OneToOneField(User)

class Interaction(models.Model):
    u1 = models.ForeignKey(User, related_name='u1s')
    u2 = models.ForeignKey(User, related_name='u2s')
    date = models.DateField()

Создание новой модели и связанной таблицы для каждого класса пользователя не похоже на хороший дизайн.

0 голосов
/ 26 ноября 2010

Вы использовали внешние ключи, чтобы связать C1, C2 с Users, и назвали это отношение один-ко-многим . Однако отношение между Interaction C1, C2 не однозначно, потому что один Interaction может быть связан со многими Users, а с одним User также может быть связано много Interactions. Это называется отношение «многие ко многим» и представлено в моделях Django с использованием models.ManyToManyField.

Поэтому попробуйте изменить файл models.py на -

class Interaction(models.Model):
    ic1 = models.ManyToManyField(C1)
    ic2 = models.ManyToManyField(C2)
    date= models.DateField()

Посмотрите, поможет ли это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...