Pergunta

I have two table(One-To-One relationship) :

class Member(models.Model):
    openid = models.CharField(max_length=32)
    realname = models.CharField(max_length=30, null=True, blank=True)
    nickname = models.CharField(max_length=32)
    join_date = models.DateField()
    ....more data ...


class MemberProfile(models.Model):
    member = models.ForeignKey(Member)
    position = models.ForeignKey(Position)
    mobile = models.CharField(max_length=50, null=True, blank=True)
    email = models.EmailField(null=True, blank=True)
    ....more data ...

Apparently, Member is master table and MemberProfile is slave.
But I find it is inconvenient to get MemberProfile's data through by Member. If Member has a ForeignKey link to MemberProfile,such as :

class Member(models.Model):
    profile = models.ForeignKey(MemberProfile)
    openid = models.CharField(max_length=32)
    realname = models.CharField(max_length=30, null=True, blank=True)
    nickname = models.CharField(max_length=32)
    join_date = models.DateField()
    ....more data ...

I can get the profile from a member more easily.
member = Member.objects.get(id=id)
I can retrieve profile by member.profile rather than one more sentence:profile = MemberProfile.objects.get(member=member)

Is it better to move ForeignKey define in Member ??

Foi útil?

Solução

Use a OnetoOneField for the member:

class MemberProfile:
    member = models.OneToOneField(Member)

Then you can access a member's profile like this:

member.memberprofile

Relevant quote from the docs:

Conceptually, this is similar to a ForeignKey with unique=True, but the “reverse” side of the relation will directly return a single object.

Outras dicas

As per your models.

class Member(models.Model):
    openid = models.CharField(max_length=32)
    ....more data ...


class MemberProfile(models.Model):
    member = models.ForeignKey(Member)
    position = models.ForeignKey(Position)
    ....more data ...

It is not much inconvenient to get MemberProfile data if we are having Member object

member_object = Member.objects.get(id=1)
print member_object.memberprofile_set.all()     # here you can access MemberProfile 
                                                #data by using reverse relationship

you can customize result as per your need like below :

print member_object.memberprofile_set.filter(mobile='9717353657')
print member_object.memberprofile_set.filter(mobile='9717353657').values_list('email')

also it is better to making Member model as master table.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top