如何? django模型字段,其值是同一模型的多个字段的选择

时间:2018-11-16 22:49:28

标签: django django-models many-to-many django-orm

我有一个名为company的Django模型,其中有很多区域,其中添加了公司成员。

我还有一个名为“ company_contact”的字段,我希望能够从其中一个company_members中进行选择,就好像它是company_members的ForeingKey一样。 没有定制的表单,ajax请求,django-autocomplete-light等,是否有一种简单的方法?

我打算使用django admin填充此模型。 谢谢

class Dm_Company(models.Model):
    company_name = models.CharField(max_length=80, blank=True, verbose_name="Razon Social")
    company_members = models.ManyToManyField(conf_settings.AUTH_USER_MODEL, verbose_name="Miembros")
    #company_contact = models.ForeignKey(conf_settings.AUTH_USER_MODEL, related_name="company_members", on_delete=models.CASCADE)
    company_phone = models.CharField(max_length=80, blank=True, verbose_name="Telefono compania")
    company_email = models.CharField(max_length=80, blank=True, verbose_name="Email compania")

2 个答案:

答案 0 :(得分:0)

我能想到的一种方法是对一个贯穿模型使用ManyToMany。

class Dm_Company(models.Model):
    company_name = models.CharField(max_length=80, blank=True, verbose_name="Razon Social")
    company_members = models.ManyToManyField(conf_settings.AUTH_USER_MODEL, through='CompanyMembership')
    ...

class CompanyMembership(models.Model):
    company = models.ForeignKey(Dm_Company)
    user = models.ForeignKey(conf_settings.AUTH_USER_MODEL)
    is_contact = models.BooleanField(default=False)

该模型的难点在于,您需要编写逻辑以防止将多个CompanyMember设置为is_contact。但是,它确实可以构造您的数据模型,从而使company_contact无法引用其他公司的用户。

答案 1 :(得分:0)

无法按照您描述的方式过滤company_contact查询集。一种替代方法是在模型中添加以下内容:

def clean_fields(self, exclude=None):
    super().clean_fields(exclude=exclude)
    if not self.company_members.exists(id=self.company_contact_id):
        raise ValidationError('contact is not member')

这将防止选择不是成员的联系人