2016-11-16 127 views
1

Django(phpまたは.Net過去から)を把握しようとすると少し挑戦します。djangoリンクされたモデルにアクセスするためのuuidプライマリキーを使用

次のモデル作成している場合:

class Member(models.Model): 
    id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False) 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 

    def __str__(self): 
     return self.last_name + ", " + self.first_name 


class Organisation(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    name = models.CharField(max_length=140) 

    def __str__(self): 
     return self.name 



class Membership(models.Model): 
    id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False) 
    member_id = models.ForeignKey('Member', on_delete=models.DO_NOTHING) 
    organisation_id = models.ForeignKey('Organisation', on_delete=models.DO_NOTHING) 
    membership_no = models.CharField(max_length=20) 

    class Meta: 
     unique_together = (("organisation_id", "member_id"), 
         ("organisation_id", "membership_no")) 

    def __str__(self): 
     mbr = Member.objects.get(pk=self.member_id) 
     org = Organisation.objects.get(pk=self.organisation_id) 
     return str(org) + ": " + str(mbr) 

を私は編集/管理者のメンバーシップモデルを表示しようとすると問題が発生します。私はエラーを受け取ります: /admin/membership/membershipのTypeError 例外値: 'Anderson、Roy'は有効なUUIDではありません。

私はDjangoバージョン1.10.3を使用しています。

文字列 'Anderson、Roy'は、メンバーモデルのデータベースエントリの1つで、メンバーモデルのstr関数によって返された値を返すように見えます。しかし、私はなぜそれがUUIDとして使用しようとしているのか分かりません。メンバシップモデルの戻り値(str関数)を作成するために、メンバモデルと組織モデルからユーザー文字列値を取得しようとしています。その機能に問題があるようです。 はこの

mbr = Member.objects.get(pk=self.member_id) 

は、与えられたUUIDのためのメンバーを取得するための正しい方法は何ですか?

大変助かりました。おかげ

答えて

2

は問題がメンバーモデルのご_ STR _方法であるあなたは、レコードのフルネームが必要な場合、あなたは完全なname.Because _ STR _メソッドを返すためにメソッドを使用する必要があります呼び出されたときにオブジェクトのデフォルト値を返します。コードは、そのメンバのidではなく、Memberのフルネームを返します。 idまたはUUIDを返すには、strの代わりに_ ユニコード _メソッドを使用します。 ので、更新されたコードは次のようにする必要があります:

class Member(models.Model): 
    id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False) 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 

    def __unicode__(self): 
     return self.id 

    def get_full_name(self): 
     return self.last_name + ", " + self.first_name 

そして、この使用:あなたがしたくない場合にも、この方法を使用することができます

mbr = Member.objects.get(pk=self.member_id) 

はUPDATE 1をあなたのメソッドをstrからUnicodeに変更する:

def __str__(self): 
    mbr = Member.objects.get(pk=self.member_id.id) 
    org = Organisation.objects.get(pk=self.organisation_id.id) 
    return str(org) + ": " + str(mbr) 

今すぐself.member_idがオブジェクトを返すので、コードに.idを追加するだけです.get()メソッドの場合は、そのオブジェクトのIDが必要です。

+0

self.idを返すように__str__を変更すると、メンバーシップの管理者は__str__が文字列を返さないことを文句を言います。私がstr(self.id)を返すように変更すると、返された値がUUIDではないと告げる。私は勝てないと思われる!私が見つけたすべてのドキュメントでは、__str__は必ずしもIDではないオブジェクトを説明するユーザーフレンドリーな文字列を返さなければならないと言います。迅速な返信をありがとう。 – user917051

+0

UUIDまたはIDが必要な場合は、_ _str_ _メソッドを完全に使用しないでください。代わりに_ _unicode_ _メソッドを使用しています。 –

+0

それはそれでした。余分な.idを追加すると問題が解決しました。本当に感謝しています。非常に感謝しています。 – user917051

関連する問題