我有一个名为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")
答案 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')
这将防止选择不是成员的联系人