2011-04-09 8 views
12

पर OneToOne उदाहरण बनाएं मैं अपना पहला django ऐप बना रहा हूं। मेरे पास एक उपयोगकर्ता है, और उपयोगकर्ता की पसंदीदा सूची है। उपयोगकर्ता के पास पसंदीदा की एक सूची होती है, और वह सूची विशेष रूप से उस उपयोगकर्ता से संबंधित होती है।मॉडल निर्माण

class User(models.Model): 
    name = models.CharField(max_length=200) 

class FavouriteList(models.Model): 
    user = models.OneToOneField(User) 
    favourites = models.ManyToManyField(Favourite, blank=True) 

नया उपयोगकर्ता बनाया जाता है, मैं उपयोगकर्ता एक FavouriteList है कि यह सुनिश्चित करना चाहते हैं। मैंने Django दस्तावेज में चारों ओर देखा है और बहुत भाग्य नहीं है।

क्या कोई यह जानता है कि मैं कैसे सुनिश्चित कर सकता हूं कि मॉडल के बच्चे के ऑब्जेक्ट (उदा। FavouriteList) बनाया गया है?

+0

संभावित डुप्लिकेट [क्या Django स्वचालित रूप से संबंधित एक-से-एक मॉडल बना सकता है?] (Http://stackoverflow.com/questions/1652550/can-django-automatically-create-a-related-one-to- एक मॉडल) –

उत्तर

24

सबसे आम तरीका यह पूरा करने के लिए Django संकेत प्रणाली का उपयोग करने के लिए है। आप उपयोगकर्ता मॉडल के लिए post_save सिग्नल में सिग्नल हैंडलर (केवल एक फ़ंक्शन कहीं भी) संलग्न कर सकते हैं और उस कॉलबैक के अंदर अपनी पसंदीदा सूची बना सकते हैं।

from django.db.models.signals import post_save 
from django.dispatch import receiver 
from django.contrib.auth.models import User 

@receiver(post_save, sender=User) 
def create_favorites(sender, instance, created, **kwargs): 
    if created: 
     Favorites.objects.create(user=instance) 

उपरोक्त को Django signals docs से अनुकूलित किया गया था। सिग्नल दस्तावेज़ों को पूरी तरह से पढ़ना सुनिश्चित करें क्योंकि कुछ ऐसे मुद्दे हैं जो आपको छीन सकते हैं जैसे कि आपका सिग्नल हैंडलर कोड लाइव होना चाहिए और डुप्लिकेट हैंडलर से कैसे बचें।

+3

न केवल सबसे आम है, यह करने के लिए * सही * तरीका है! – Agos

+0

ने दस्तावेज़ों को 1.3 से 1.11 तक अपडेट किया। 'dev' दस्तावेज़ कभी भी पुराने नहीं होंगे, लेकिन शायद यह बेहतर संपादन – TankorSmash

+0

बहुत उपयोगी होगा। :) –

2

एक तरह से अगले हैंडलर के साथ एक post_save संकेत रजिस्टर करने के लिए होगा:

def user_save(sender, instance, created, **kwargs): 
    if created: 
    FavouriteList.objects.get_or_create(user=instance) 
7

एक उत्कृष्ट django-annoying प्लगइन AutoOneToOneField के साथ आपके लिए यह हल करता है। मैं उन सभी django परियोजनाओं में उपयोगकर्ता प्रोफाइल के लिए इसका उपयोग कर रहा हूं जिन पर मैं काम करता हूं।

+0

यह बहुत अच्छा है ... मैं हाल ही में इस उछाल के माध्यम से कूद रहा प्रतीत होता हूं। पारितोषिक के लिए धन्यवाद। – nicorellius

संबंधित मुद्दे