0

私はすべてのユーザー用の facebook フレンド テーブルを持っており、ユーザー用に manytomany フィールドを持ちたいのですが、データを保存する際に問題が発生しました。

これが私のコードです:

私のモデル:

class FacebookFriend(models.Model):
user = models.ManyToManyField(User)
name = models.CharField(max_length="100", unique=False, db_index=True)
fid = models.CharField(max_length="30", unique=False, db_index=True)
birthday = models.DateTimeField(default="1776-07-04")
gender = models.CharField(max_length="10", default="NoData")
avatar = models.URLField()

私の管理:

from django.db import models
from django.contrib.auth.models import User
from facepy import GraphAPI
from social_auth.signals import socialauth_registered

def facebook_friend_data(sender, user, response, details, **kwargs):

if sender == FacebookBackend:
    dict = UserSocialAuth.objects.filter(user=user.id).get()
    access_token = dict.extra_data['access_token']
    uid = dict.uid
    graph = GraphAPI(access_token)
    friends = graph.get(uid + '/friends?fields=id,name,birthday,gender,picture')

    from datetime import datetime
    from urllib2 import HTTPError

    try:
        for f in friends['data']:
            friend = FacebookFriend()
            friend.fid = f['id']
            friend.name = f['name']
            try:
                friend.gender = f['gender']
            except KeyError:
                pass
            try:
                bs= f['birthday'].split('/')
                if len(f['birthday'])==10:
                    formatted_bday= bs[2] + '-' + bs[0] + '-' + bs[1]
                else:
                    formatted_bday= '1900-' + bs[0] + '-' + bs[1]
                try:
                    friend.birthday = datetime.strptime(formatted_bday, '%Y-%m-%d')
                except ValueError:
                    pass
            except KeyError:
                pass
            friend.avatar = f['picture']
            friend.save()
            friend.user.add(user)

    except HTTPError:
        pass
socialauth_registered.connect(facebook_friend_data, sender=None)

私のエラー:

IntegrityError at /complete/facebook/
duplicate key value violates unique constraint "users_facebookfriend_fid_key"

Facebook の処理に Django Social Auth を使用しています。モデルとデータの保存方法に問題があることはわかっていますが、その方法がわかりません。

ありがとうございます。他に何か必要な場合はお知らせください。

4

1 に答える 1

0

FacebookFriendの最初のバージョンには のfidフィールドがあると思いますunique=True。モデルを更新した後、データベースを再作成するのを忘れています。さらにmanage.py syncdb、モデルを変更すると機能しなくなります。既存のテーブルまたはデータベースを削除してから、manage.py syncdbもう一度実行してください。southまた、またはという名前の派手なツールもありdjango-south、django でのスキーマ/データの移行に役立ちます。

于 2012-07-13T02:22:19.917 に答える