Django orm проверить данные на их наличие в БД
Подскажите пожалуйста как проверить введенного "артиста" в форму на его наличие в БД. Класс CD у которого есть поле artist написал ниже. Спасибо заранее
class CD(models.Model):
title = models.CharField(max_length=100)
description = models.TextField(null=True, blank=True)
artist = models.CharField(max_length=40)
genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
from django import forms
from .models import GENRE_CHOICES
from .models import CD
from django.core.exceptions import ValidationError
class ExchangeForm(forms.Form):
name = forms.CharField(max_length= 100)
email = forms.EmailField()
title = forms.CharField(max_length= 100)
artist = forms.CharField(max_length= 40)
genre = forms.ChoiceField(choices= GENRE_CHOICES)
price = forms.DecimalField(required=False)
comment = forms.CharField(widget=forms.Textarea, required=False)
def cleaned_data(self):
artist = self.cleaned_data['artist']
art_list = CD.objects.values('artist')
if artist not in art_list:
raise forms.ValidationError("Нет такого артиста!!!")
return artist
Ответы (2 шт):
Автор решения: Andrey Maslov
→ Ссылка
Тебе нужно найти cd с таким артистом и если таковых нет, то выдать Exception?
def clean(self):
cleaned_data = super().clean()
artist = cleaned_data.get('artist')
artist_exists = artist is not None and CD.objects.filter(artist=artist).exists()
if not artist_exists:
raise forms.ValidationError("Нет такого артиста!!!")
return cleaned_data
Но я бы рекомендовал тебе переработать структуру БД, что бы вынести artist в отдельную модель и везде использовать ссылку на нее.
Автор решения: Za Ars
→ Ссылка
Если это значение уникальное, можно указать unique=True
artist = forms.CharField(max_length=40, unique=True)
Так же можно написать валидатор для этого поля, где проверять наличие этого артиста в базе. Об этом написано в доке.
Ну и основной вариант написал @Andrey Maslov.
Этот ответ просто дополняет вариантами решения уже существующий