2016-03-10 11 views
5

Erstes Modell:Django Tastypie: post-Wert in mehreren Modellen zu einem einzigen Tastypie Ressource

class Profile(models.Model): 

    username = models.CharField(
     _('username'), 
     max_length=150, 
     unique=True, 
     help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'), 
     validators=[ 
      validators.RegexValidator(
       r'^[\[email protected]+-]+$', 
       _('Enter a valid username. This value may contain only ' 
        'letters, numbers ' 'and @/./+/-/_ characters.') 
      ), 
     ], 
     error_messages={ 
      'unique': _("A user with that username already exists."), 
     }, 
    ) 
    password = models.CharField(max_length=12, default='123456') 
    first_name = models.CharField(_('first name'), max_length=30, blank=True) 
    last_name = models.CharField(_('last name'), max_length=30, blank=True) 
    email = models.EmailField(_('email address'), blank=True) 
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now) 

zweites Modell:

class UserEbiz(models.Model): 
    user_id = models.ForeignKey('Profile') 
    password = models.CharField(max_length=12, default='123456') 

Tastypie Ressource:

class ProfileResources(ModelResource): 
    id = fields.CharField(attribute='id') 

    class Meta: 
     queryset = Profile.objects.all() 
     resource_name = 'profile' 

     filtering = { 
      "id": ALL, 
     } 

Ich mag erstellen eine Funktion, die gleichzeitig einen Wert in beiden Tabellen speichern kann, indem nur eine Ressource verwendet wird. Meine Frage ist, wie man Werte in Profile und UserEbiz-Modelle mit ProfileResources einträgt.

+0

Warum erstellen Sie keine Ressource für UserEbiz-Modell ...! – Satyajeet

+0

Ok. Nachdem ich eine Ressource für das UserEbiz-Modell erstellt habe, was soll ich für den nächsten Schritt tun. – nuriffah

Antwort

1

Sie werden so etwas wie dies wollen:

class UserEbizResource(ModelResource): 
    user_id = fields.ToOneField(ProfileResources, attribute='user_id') 

    class Meta: 
     queryset = UserEbiz.objects.all() 
     resource_name = 'userebiz' 

     excludes = ['password'] 
     filtering = { 
      "id": ALL, 
     } 

Einige andere Vorschläge:

  • Umbenennen ProfileResources-ProfileResource
  • Umbenennen UserEbiz.user_id-UserEbiz.profile
  • Betrachten Djangos User-Modell oder Customizing mit es anstelle eines vollständig benutzerdefinierten Modells
2

@ sean-hayes Antwort ist in Ordnung, aber wenn Sie wirklich wollen, Post Daten auf ProfileResource statt UserEbiz erste Änderung ProfileResource zu

class ProfileResource(ModelResource): 
    ebiz = fields.ToManyField(UserEbizResource, 'userebiz_set', readonly=True) 

Hinweis Erste, dass Sie eine ForeignKey von Profile. So ist es 1:M für Profile zu UserEbiz.

Sekunde Ich habe readonly auf True gesetzt, weil ich UserEbiz Daten selbst behandeln werde. Wenn Sie jedoch models.ForeignKey('Profile', blank=True, null=True) haben, dann ist es wie Erstellen von M2M Daten, so entfernen Sie einfach das readonly Attribut und Sie sind alle eingestellt.

So können Sie override die obj_createebiz Daten selbst behandeln. Code könnte wie aussehen

def obj_create(self, bundle, **kwargs): 
    ebiz = bundle.data.pop('ebiz', None) 
    bundle = super(ProfileResource, self).obj_create(bundle, **kwargs) 
    if not ebiz: 
     return bundle 

    ebiz.update(user_id=bundle.obj) # change it to user in model and here 
    ebiz_res = UserEbizResource() 
    ebiz_bundle = ebiz_res.build_bundle(data=ebiz) 
    ebiz_res.obj_create(ebiz_bundle) 
    return bundle 
+0

Ich habe bereits Ihren Code ausprobiert, aber ich bekomme diesen Fehler "error_message": "super (type, obj): obj muss eine Instanz oder ein Untertyp sein", – nuriffah

+0

@nuriffah Sie übergeben die Ressourceninstanz nicht an die Superklasse. Können Sie Ihre Frage mit Wie Sie '' '' obj_create''' ... aktualisieren? – Satyajeet

+0

Ich habe diesen Fehler zwar schon gelöst aber wenn Post bereits erfolgreich in Profilesource aber nicht in UserEbizResource..data nicht in UserEbiz-Modellen gespeichert ist. – nuriffah