Найдите поле, которое соединяет модель со сквозной моделью - PullRequest
0 голосов
/ 14 сентября 2018

Допустим, у меня есть модели, определенные как:

# The class that I will have the instance of.
class A(models.Model):
    somefieldA = models.TextField()
    m2mfield = models.ManyToManyField(B, through='AandB')

    def __unicode__(self):
        return self.somefieldA


# The model that participates in the m2m field.
class B(models.Model):
    somefieldB = models.TextField()

    def __unicode__(self):
        return self.somefieldB


# Model that stores the extra information
# about the m2m rel.
class AandB(models.Model):
    a = models.ForeignKey(A)
    b = models.ForeignKey(B)
    field1 = models.DecimalField()
    field2 = models.TextField()
    field3 = models.DateField()

Мое требование - выполнить итерацию по всем объектам в модели AandB.Я знаю, что могу сделать это через ( подробности здесь ):

# I have the instance of model A
for field in instance._meta.get_fields(include_hidden=True):
    if field.one_to_many:
        mgr = getattr(instance, field.get_accessor_name())
        for obj in mgr.all():
            # Do stuff here.

Мой вопрос, есть ли способ получить имя поля, через которое связана модель AandBк модели A?(Который в этом случае будет m2mfield).

1 Ответ

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

После обсуждения здесь и идеи, которая возникла после @schwobaseggl, которая задала мне вопрос в разделе комментариев, я просто решил использовать свойство related_name, чтобы облегчить мою жизнь.Хотя я не могу получить точное название поля, но я могу передать любое имя, которое мне нравится, в related_name, чтобы в конечном итоге прийти к заключению, которое я хотел первоначально.

# Model that stores the extra information
# about the m2m rel.
class AandB(models.Model):
    a = models.ForeignKey(A, related_name='name_I_like_here')
    b = models.ForeignKey(B)
    field1 = models.DecimalField()
    field2 = models.TextField()
    field3 = models.DateField()

И тогда я могуиспользуйте get_accessor_field(), чтобы получить обе связанные модели AandB, а также назвать отношение, как я делал выше.Это имеет смысл для меня.Я надеюсь, что это также поможет кому-то еще.

В то же время, если у кого-то есть какие-либо другие предложения, пожалуйста, не стесняйтесь оставлять комментарии или ответ!

...