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.

Этот ответ просто дополняет вариантами решения уже существующий

→ Ссылка