Как? Поле модели Джанго, значением которого является выбор множества полей той же модели - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть модель django, называемая компанией, с множеством полей, в которые добавляются члены компании.

У меня есть другое поле, названное «company_contact», где я хочу иметь возможность выбрать один из company_members, как если бы это был ForeingKey для company_members. Есть ли простой способ сделать это без пользовательских форм, ajax-запроса, django-autocomplete-light и т. Д.?

Я собираюсь заполнить эту модель с помощью администратора django. Спасибо

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 голосов
/ 17 ноября 2018

Нет способа фильтровать набор запросов 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')

Это предотвратит выбор контакта, который не является членом

0 голосов
/ 17 ноября 2018

Единственный способ, которым я могу придумать, - это использовать 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)

Сложность этой модели заключается в том, что вам необходимо написать логику, чтобы предотвратить более одного члена компании.устанавливается как is_contact.Однако она структурирует вашу модель данных таким образом, что для company_contact нет возможности ссылаться на пользователя в другой компании.

...