Django — Назначить и ограничить каждого зарегистрированного пользователя для создания только одного экземпляра

#python #django #django-models #django-forms #django-views

#python #django #django-модели #django-forms #django-просмотры

Вопрос:

Как ограничить каждого вошедшего в систему пользователя созданием только одного экземпляра / объекта из интерфейса?

вот мой model выглядит так:

 class MyModel(models.Model):
    u_name = models.OneToOneField(User, on_delete=models.CASCADE)
    category = models.ForeignKey(Category, blank=True, null=True, on_delete=models.CASCADE)
    ...
    ...
    my_linkedin = models.URLField(unique=True, blank=True, null=True)
    my_price = models.CharField(max_length=20, default=0)

    joined = models.DateTimeField(default=now, editable=False)

    def __str__(self):
        return self.my_name

    def clean(self):
        model = self.__class__
        if model.objects.count() > 0 and 
                self.id != model.objects.get().u_name_id:
            print('hell')
            raise ValidationError("You can only create 1 profile ")
  

мой views :

 class MyCreateView(LoginRequiredMixin, CreateView):
    model = MyModel
    fields = [
        'category',
        ....
        ....
    ]
    template_name = 'index/form.html'
    success_url = '/'

    def form_valid(self, form):
        form.instance.u_name = self.request.user
        return super().form_valid(form)
  

И мой form :

 class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyProfile
        fields = '__all__'
        exclude = ['u_name']
  

Проблема в том, что текущий код здесь они не могут назначить каждому вошедшему в систему пользователю.
Поэтому, когда я пытаюсь войти в систему с помощью другого пользователя, ошибка выглядит так:

 get() returned more than one MyModel -- it returned 3!
  

Как я могу этого добиться?

Ответ №1:

    def clean(self):
      model = self.__class__
        if model.objects.count() > 0 and 
                self.id != model.objects.get().u_name_id:
            print('hell')
            raise ValidationError("You can only create 1 profile ")
  

model.objects.get() -> Это причина этой ошибки. get() должен возвращать только один объект из этой таблицы. Но из того, что я вижу, в этой таблице 3 строки. Вы должны добавить параметры в функцию get, возвращающую один объект, тогда вы сможете получить доступ к этому объекту u_name_id. Вот так:

    if model.objects.count() > 0 and model.objects.filter(u_name_id = self.u_name_id).count > 0:
   print("hell")
   raise ValidationError("You can only create 1 profile ")
  

Или:

 from django.core.exceptions import ObjectDoesNotExist
.
.
.
   if model.objects.count() > 0:
       try:
          obj = model.objects.get(u_name_id = self.u_name_id)
          print("hell")
          raise ValidationError("You can only create 1 profile ")
       except ObjectDoesNotExist:
          pass # this is not problem for you because this user have not object