Джанго — форлуп в model.py чтобы назначить внешний ключ

#python #django #django-models #foreign-keys

Вопрос:

У меня есть две модели — Пользователь и Ранг. Во время сохранения def() я хочу, чтобы рангу пользователей автоматически присваивался ранг в зависимости от баллов, набранных пользователем, и минимальных баллов из модели рангов.

Модели

 class User(AbstractUser):
    points = models.IntegerField(default=0)
    rank = models.ForeignKey(Rank, on_delete=models.SET_NULL, null=True, blank=True)


class Rank(models.Model):
    rank = models.CharField(max_length=200)
    min_points = models.IntegerField()
 

Теперь я добавил функцию сохранения() в пользовательскую модель, чтобы проверить баллы пользователей и сравнить их с правильным рангом

 # ...user model
def save(self, *args, **kwargs):
    for i in Rank.objects.all():
        if self.points >= i.min_points:
            self.rank == Rank.objects.get(id=i.id)
    super().save(*args, **kwargs)
 

К сожалению, после сохранения или создания нового пользователя ничего не произошло.

Мое предупреждение о броске IDE: Неразрешенная ссылка на атрибут «объекты» для класса «Ранг»

Я что-то пропустил? Я не могу разобраться в этой проблеме…

Комментарии:

1. self.rank == Rank.objects.get(id=i.id) ничего не будет делать, так как это означает только, что вы проверяете равенство, и независимо от того, что вы делаете, это ничего не делает с этой информацией.

2. @WillemVanOnsem хорошо, и как я могу установить внешний ключ self.rank?

3. с self.rank = ... , но вы не должны перечислять в первую очередь. Вы можете исправить это с помощью одного запроса.

Ответ №1:

Нет необходимости перечислять Rank объекты. Мы можем получить Rank с наибольшим количеством min_points , которое меньше или равно с self.points :

 def save(self, *args, **kwargs):
    self.rank = Rank.objects.filter(
        min_points__lte=self.points
    ).latest('min_points')
    return super().save(*args, **kwargs) 

Комментарии:

1. Спасибо! Это работает на меня. У вас есть ссылка, где я могу прочитать больше о вашем решении?

2. @Dariun: смотри docs.djangoproject.com/en/dev/ref/models/querysets/#latest