【问题标题】:How To? django model field whose value is a choice of a manytomany field of the same model如何? django 模型字段,其值是同一模型的多对多字段的选择
【发布时间】:2019-04-20 03:31:18
【问题描述】:

我有一个名为 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")

【问题讨论】:

  • 但是你是什么意思?,你想在company_contact中只选择从company_members字段中提取的Auth User模型的一个成员吗?
  • @jsanchezs 完全正确。我只需要选择一个属于 company_members 的用户
  • 为什么 company_members 字段与 company_contact 不同?,您可以在第一个选择中使用一个覆盖它的字段,如果它们不同,那么 company_contact 的字段设置与 company_members 中的字段设置相同
  • Company_contact 只是 company_members 之一。 Company_members 可以有很多

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


【解决方案1】:

我能想到的一种方法是将 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 无法引用其他公司的用户。

【讨论】:

    【解决方案2】:

    没有办法以您描述的方式过滤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')
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-17
      • 2021-11-27
      • 2016-10-10
      • 1970-01-01
      • 2019-02-22
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多