Django反向存取器冲突

Django反向存取器冲突,django,Django,所以这里我遇到了很多关于反向访问器冲突的问题。我认为我的模型结构非常聪明和干练,能够对任何类型的配置文件使用user.profile,或者对任何一个提供程序使用provider.profile。。。但是我到处都有碰撞错误 介意看一下我的代码,看看是否有什么方法可以欺骗我,这样我就可以只使用user.profile而不需要知道哪种profile(同样,provider.profile也不需要知道哪种provider)?或者只是告诉我,我试图做的是不可能的,还有更好的解决办法吗 class Base

所以这里我遇到了很多关于反向访问器冲突的问题。我认为我的模型结构非常聪明和干练,能够对任何类型的配置文件使用user.profile,或者对任何一个提供程序使用provider.profile。。。但是我到处都有碰撞错误

介意看一下我的代码,看看是否有什么方法可以欺骗我,这样我就可以只使用user.profile而不需要知道哪种profile(同样,provider.profile也不需要知道哪种provider)?或者只是告诉我,我试图做的是不可能的,还有更好的解决办法吗

class BaseProfileModel(models.Model):
    '''
    An abstract model class containing fields and/or methods relevant to all users.
    '''
    user = models.OneToOneField(User, related_name="profile", primary_key=True)
    phone = PhoneNumberField(verbose_name=_("Phone Number"))
    pic = models.ImageField(upload_to=get_upload_file_name,
                            width_field="width_field",
                            height_field="height_field",
                            null=True,
                            blank=True,
                            verbose_name=_("Profile Picture")
                           )
    height_field = models.PositiveIntegerField(null=True, default=0)
    width_field = models.PositiveIntegerField(null=True, default=0)
    thumbnail = ImageSpecField(source='pic',
                                   processors=[ResizeToFill(180,180)],
                                   format='JPEG',
                                   options={'quality': 100})
    bio = models.TextField(
        verbose_name=_("About"),
        default="",
        blank=True,
        max_length=800
    )

    class Meta:
        abstract = True

    def __str__(self):
        if self.user.email:
            return self.user.email
        else:
            return self.user.username

    @property
    def is_provider(self):
        return hasattr(self, 'provider')

    def get_absolute_url(self):
        return reverse_lazy(self.profile_url_name, kwargs={'pk': self.pk})

    # Methods

class BaseHumanProfileModel(BaseProfileModel):
    '''
    Abstract base class containing fields relevant to human users
    '''
    birth_date = models.DateField(verbose_name=_("Date of Birth"))
    GENDER_CHOICES = (
        ('M', _('Male')),
        ('F', _('Female')),
        ('N', _('Not Specified')),
    )
    gender = models.CharField(
        max_length=1, choices=GENDER_CHOICES, default='N', verbose_name=_('Gender'))

    class Meta:
        abstract = True

class CustomerProfile(BaseHumanProfileModel):
    '''
    Concrete Human subclass for the consumers
    '''
    home_location = models.OneToOneField(
        Location,
        related_name='customer',
        null=True,
        blank=True,
        on_delete=models.SET_NULL
        )
    profile_url_name = 'profiles:customer_profile'

    # Methods

class Provider(models.Model):
    '''
    Class containing information needed for providers
    Other models (provider profiles, reviews, events, etc.) will use this class
    as ForeignKey to interface with functionalities related to creating and managing
    sessions/listings.
    '''
    stripe_access_token = models.TextField(blank=True, default='')

    # Methods....


class IndividualProviderProfile(BaseHumanProfileModel):
    '''
    Concrete subclass for representing the profile of an individual provider.
    '''
    provider = models.OneToOneField(Provider, related_name='profile')
    locations = models.ManyToManyField(Location, null=True, blank=True, related_name='individual_providers')
    specialties = models.CharField(
        verbose_name=_("Specialties"),
        max_length=200,
        blank=True,
    )
    certifications = models.CharField(
        verbose_name=_("Certifications"),
        max_length=200,
        blank=True,
    )
    profile_url_name = 'profiles:individual_provider_profile'

    # methods


class OrganizationProviderProfile(BaseProfileModel):
    '''
    Profile representing a provider that is an organization.
    Contains key to provider class for interfacing with session scheduling
    Also contains set of individual providers that work for the organization.
    '''
    provider = models.OneToOneField(Provider, related_name='profile')
    website = models.URLField(blank=True)
    location = models.ForeignKey(Location, related_name='organization')
    employees = models.ManyToManyField(IndividualProviderProfile, null=True, blank=True, related_name='organization')

    @property
    def locations(self):
        return Locations.objects.filter(pk=self.location.pk)

    profile_url_name = 'profiles:organization_provider_profile'

    #methods
现在,当我尝试同步数据库时,会收到一组相当长且强烈的警告:

CommandError: System check identified some issues:

ERRORS:
profiles.CustomerProfile.user: (fields.E304) Reverse accessor for 'CustomerProfile.user' clashes with reverse accessor for 'OrganizationProviderProfile.user'.
    HINT: Add or change a related_name argument to the definition for 'CustomerProfile.user' or 'OrganizationProfile.user'.
profiles.CustomerProfile.user: (fields.E304) Reverse accessor for 'CustomerProfile.user' clashes with reverse accessor for 'IndividualProviderProfile.user'.
    HINT: Add or change a related_name argument to the definition for 'CustomerProfile.user' or 'IndividualProviderProfile.user'.
profiles.CustomerProfile.user: (fields.E305) Reverse query name for 'CustomerProfile.user' clashes with reverse query name for 'OrganizationProviderProfile.user'.
    HINT: Add or change a related_name argument to the definition for 'CustomerProfile.user' or 'OrganizationProviderProfile.user'.
profiles.CustomerProfile.user: (fields.E305) Reverse query name for 'CustomerProfile.user' clashes with reverse query name for 'IndividualProviderProfile.user'.
    HINT: Add or change a related_name argument to the definition for 'CustomerProfile.user' or 'IndividualProviderProfile.user'.
profiles.OrganizationProfile.provider: (fields.E304) Reverse accessor for 'OrganizationProviderProfile.provider' clashes with reverse accessor for 'IndividualProviderProfile.provider'.
    HINT: Add or change a related_name argument to the definition for 'OrganizationProviderProfile.provider' or 'IndividualProviderProfile.provider'.
profiles.OrganizationProviderProfile.provider: (fields.E305) Reverse query name for 'OrganizationProviderProfile.provider' clashes with reverse query name for 'IndividualProviderProfile.provider'.
    HINT: Add or change a related_name argument to the definition for 'OrganizationProviderProfile.provider' or 'IndividualProviderProfile.provider'.
profiles.OrganizationProviderProfile.user: (fields.E304) Reverse accessor for 'OrganizationProviderProfile.user' clashes with reverse accessor for 'CustomerProfile.user'.
    HINT: Add or change a related_name argument to the definition for 'OrganizationProviderProfile.user' or 'CustomerProfile.user'.
profiles.OrganizationProviderProfile.user: (fields.E304) Reverse accessor for 'OrganizationProviderProfile.user' clashes with reverse accessor for 'IndividualProviderProfile.user'.
    HINT: Add or change a related_name argument to the definition for 'OrganizationProviderProfile.user' or 'IndividualProvider.user'.
profiles.OrganizationProviderProfile.user: (fields.E305) Reverse query name for 'OrganizationProviderProfile.user' clashes with reverse query name for 'CustomerProfile.user'.
    HINT: Add or change a related_name argument to the definition for 'OrganizationProviderProfile.user' or 'CustomerProfile.user'.
profiles.OrganizationProviderProfile.user: (fields.E305) Reverse query name for 'OrganizationProviderProfile.user' clashes with reverse query name for 'IndividualProviderProfile.user'.
    HINT: Add or change a related_name argument to the definition for 'OrganizationProviderProfile.user' or 'IndividualProvider.user'.
profiles.IndividualProviderProfile.provider: (fields.E304) Reverse accessor for 'IndividualProviderProfile.provider' clashes with reverse accessor for 'OrganizationProviderProfile.provider'.
    HINT: Add or change a related_name argument to the definition for 'IndividualProviderProfile.provider' or 'OrganizationProviderProfile.provider'.
profiles.IndividualProviderProfile.provider: (fields.E305) Reverse query name for 'IndividualProviderProfile.provider' clashes with reverse query name for 'OrganizationProviderProfile.provider'.
    HINT: Add or change a related_name argument to the definition for 'IndividualProviderProfile.provider' or 'OrganizationProviderProfile.provider'.
profiles.IndividualProviderProfile.user: (fields.E304) Reverse accessor for 'IndividualProviderProfile.user' clashes with reverse accessor for 'CustomerProfile.user'.
    HINT: Add or change a related_name argument to the definition for 'IndividualProviderProfile.user' or 'CustomerProfile.user'.
profiles.IndividualProviderProfile.user: (fields.E304) Reverse accessor for 'IndividualProviderProfile.user' clashes with reverse accessor for 'OrganizationProviderProfile.user'.
    HINT: Add or change a related_name argument to the definition for 'IndividualProviderProfile.user' or 'OrganizationProviderProfile.user'.
profiles.IndividualProviderProfile.user: (fields.E305) Reverse query name for 'IndividualProviderProfile.user' clashes with reverse query name for 'CustomerProfile.user'.
    HINT: Add or change a related_name argument to the definition for 'IndividualProviderProfile.user' or 'CustomerProfile.user'.
profiles.IndividualProviderProfile.user: (fields.E305) Reverse query name for 'IndividualProviderProfile.user' clashes with reverse query name for 'OrganizationProviderProfile.user'.
    HINT: Add or change a related_name argument to the definition for 'IndividualProviderProfile.user' or 'OrganizationProviderProfile.user'.

相关的\u名称必须是唯一的。您给所有相关的
名称赋予了相同的名称

尝试按如下方式重命名它们:

user = models.OneToOneField(User, related_name="custom_user_profile", primary_key=True)
#..
provider = models.OneToOneField(Provider, related_name='user_ind_provider_profile')
#..
provider = models.OneToOneField(Provider, related_name='user_org_provider_profile')

啊,当我知道这两个名字中只有一个会被分配时,我就没有办法用一个相关的名字来指代这两个名字了?另外,如果你对django有一两点了解,你介意看看我之前写的这篇文章并提供一些意见吗?我正在尝试选择不同的数据结构方式。
related_name
将是db table中唯一的列,因此模型不能有两个或多个同名的传出关系。尽管上面的代码仍然不能为我这样做,因为user上的related name可能指向任何3个具体概要文件类中的一个,这对数据库不起作用。基本上意味着我的整个多态性方案根本不起作用。@rfj001但这解决了你的冲突问题,对吗?@rfj001你让事情变得更复杂了。