Django:预先选择或标记。模型关系

时间:2019-02-25 18:03:42

标签: django django-models database-design django-rest-framework database-relations

Django版本为2.1.7

你好,我有一个一对多的关系,我问自己是否有可能为农民进行某种预选(标签或类似标签?)? 因为不是每个农民都拥有或想要鸡,或者他只是牛的专家。 意思是,现在,每当我想将单个动物分配给农民时,我都会在Django Admin中看到所有农民。随着越来越多的农民,它变得令人困惑。因此,我想在Farmers模型中插入某种类型的模型字段,例如chickens = true or not truecows = true or not true或为每个物种引入一个新模型。

我的目标是为每个农民分配一组物种。因此,下一次我要添加鸡django时,仅显示将在其农田上与鸡一起工作的农民,当某些农民知道他们只处理一组特定物种时,则不显示所有农民。

作为一个新手,我想我必须为每个具有ManyToMany关系的物种创建一些新模型?因此Farmers > << / strong> 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 个答案:

答案 0 :(得分:1)

如果我们使用postgres作为数据库,则arrayField link 可以很好地完成这项工作。

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 link之后,我们可以使用ListField link之类的字段功能,并且可以轻松实现。

答案 1 :(得分:0)

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)

''' 我认为这会给你最好的缓解 '''