Tengo un modelo de usuario personalizado:
from django.contrib.auth.models import AbstractUser class CustomUser(AbstractUser): is_worker = models.BooleanField(default=False) is_customer = models.BooleanField(default=True) def __str__(self): return f'{self.username} - {self.is_worker}'Y tengo este modelo de servicios:
from django.db import models from users.models import CustomUser SERVICE_CHOICES = ( ('Carpenter', 'Carpenter'), ('Driver', 'Driver'), ('Ambulanve', 'Ambulanve'), ('Spa', 'Spa'), ('Barber', 'Barber'), ('Cleaning', 'Cleaning'), ('Cook', 'Cook'), ) class Service(models.Model): name = models.ForeignKey(CustomUser, on_delete=models.CASCADE) service = models.CharField(choices=SERVICE_CHOICES,max_length=100) def __str__(self): return f'{self.service} - {self.name}' En el modelo de servicios, estoy usando el modelo CustomUser para el nombre. Mientras que solo necesito esos nombres donde is_worker = True . En mi código, obtengo todos los usuarios independientemente del estado. ¿Cómo puedo cambiarlo?
Puede usar ForeignKey.limit_choices_to para establecer un límite de opciones disponibles para un campo de clave externa. En tu caso :
class Service(models.Model): name = models.ForeignKey(CustomUser, on_delete=models.CASCADE, limit_choices_to={'is_worker': True},) service = models.CharField(choices=SERVICE_CHOICES,max_length=100) def __str__(self): return f'{self.service} - {self.name}'documento Django
algo como eso:
class ServiceForm(ModelForm): def __init__( self, *args, **kwargs ): super().__init__(*args, **kwargs) if self.instance and self.instance.is_worker: self.fields['service'].widget = forms.Select( choices=[(k, v) for i in SERVICE_CHOICES if v in ('Barber', 'Spa')] )