Джанго: предварительный выбор или теги. модельные отношения
Джанго версия 2.1.7
Здравствуйте, у меня есть отношение OneToMany, и я спрашиваю себя, есть ли возможность сделать какой-то предварительный выбор (теги или около того?) Для моих фермеров? Потому что не каждый фермер имеет или хочет куриц, или он специализируется только на коровах. Значит, сейчас, когда я хочу назначить отдельное животное фермеру, я вижу всех фермеров, отображаемых в моем администраторе Django. С ростом числа фермеров это сбивает с толку. Так что я подумал вставить в поле своего рода поле модели Farmers
Модель... как chickens = true or not true
а также cows = true or not true
или ввести новую модель для каждого вида.
Моя цель - назначить набор видов каждому фермеру. Так что в следующий раз, когда я захочу добавить курицу, Джанго показывает только фермеров, которые будут работать с цыплятами на их фермах, нет смысла отображать всех фермеров, когда некоторые фермеры знают, что они обрабатывают только определенный набор видов.
Как новичок, я бы предположил, что мне нужно сделать несколько новых моделей для каждого вида с отношением ManyToMany? Так Farmers
>< Species X, Y, Z
< Indiviual Anmial
,
Спасибо
class Farmers(models.Model):
name = models.CharField(max_length=100)
farm_img = models.ImageField(upload_to='farm/', max_length=255, null=True, blank=True)
slug_farm = models.SlugField(blank=True)
<...>
class Chickens(models.Model):
farmer = models.ForeignKey(Farmers, on_delete=models.CASCADE, null=True)
chickenname = models.CharField(max_length=100)
<...>
class Cows(models.Model):
farmer = models.ForeignKey(Farmers, on_delete=models.CASCADE, null=True)
cowname = models.CharField(max_length=100)
<...>
class Rabbits(models.Model):
farmer = models.ForeignKey(Farmers, on_delete=models.CASCADE, null=True)
cowname = models.CharField(max_length=100)
<...>
2 ответа
Если мы используем postgres
как БД arrayField
ссылка может быть хорошим вариантом для выполнения этой работы.
from django.contrib.postgres.fields import ArrayField
class Farmers(models.Model):
.... necessary fields
SAMPLE_CHOICES = (
('CHICKEN', 'CHICKEN'),
('COW, 'COW'),
('No Species', 'No Species')
.....
)
choices = ArrayField(
models.CharField(choices=SAMPLE_CHOICES, max_length=10, blank=True, default='No Species'),
)
Теперь, когда нам нужно отфильтровать Farmer
модель, основанная на выборе, мы можем сделать это следующим образом
Farmer.objects.filter(choices__contains=['cow'])
Обновить
Поскольку вы используете базу данных django-mysql, django-mysql
ссылка здесь у нас может быть поле, например, ListField
ссылка и может легко достичь этого.
class ChickenFarmers(models.Model):
name = models.CharField(max_length=100)
farm_img = models.ImageField(upload_to='farm/', max_length=255, null=True, blank=True)
slug_farm = models.SlugField(blank=True)
class CowFarmers(models.Model):
name = models.CharField(max_length=100)
farm_img = models.ImageField(upload_to='farm/', max_length=255, null=True, blank=True)
slug_farm = models.SlugField(blank=True)
class RabbitsFarmers(models.Model):
name = models.CharField(max_length=100)
farm_img = models.ImageField(upload_to='farm/', max_length=255, null=True, blank=True)
slug_farm = models.SlugField(blank=True)
class Chickens(models.Model):
farmer = models.ForeignKey(ChickenFarmers, on_delete=models.CASCADE, null=True)
chickenname = models.CharField(max_length=100)
class Cows(models.Model):
farmer = models.ForeignKey(CowFarmers, on_delete=models.CASCADE, null=True)
cowname = models.CharField(max_length=100)
class Rabbits(models.Model):
farmer = models.ForeignKey(RabbitsFarmers, on_delete=models.CASCADE, null=True)
cowname = models.CharField(max_length=100)
'''Я думаю, что на данный момент это даст вам лучшее облегчение' ''