Mongoengine - त्रुटि का चयन

मैं एक एपीआई बना रहा हूं जो मोंगोइंजिन (मोंगोडीबी) और फ्लास्क का उपयोग करता है।

मुझे एक समस्या है। मेरे पास एक मोंगोड संग्रह है - स्कीमा:

class Word(EmbeddedDocument):
    word_id = IntField()
    word = StringField()
    translation = StringField()
    strength = IntField()
    meta = {'collection': 'users'}

    def to_dict(self):
        return mongo_to_dict(self)

class User(Document):
    user_id = IntField()
    username = StringField()
    email = EmailField()
    password = StringField()
    words = ListField(EmbeddedDocumentField(Word))
    meta = {'collection': 'users',
    'ordering': ['-user_id']

मैं url api/उपयोगकर्ता/xxx/शब्दों के साथ word_id के साथ शब्द दिखा सकता / जब मैं आईडी 5 के साथ शब्द हटा देता हूं, और संग्रह इस तरह दिखेगा

[
    {
        "username": "xxx",
        "password": "yyy",
        "words": [
            {
                "translation": "ajlkjbc", 
                "strength": 1, 
                "word": "abjlkc", 
                "word_id": 1
            }, 
            {
                "translation": "ajlkjbc", 
                "strength": 1, 
                "word": "ahkjc", 
                "word_id": 2
            }, 
            {
                "translation": "aklbc", 
                "strength": 5, 
                "word": "jklc", 
                "word_id": 3
            }, 
            {
                "translation": "afdfsc", 
                "strength": 1, 
                "word": "acjj", 
                "word_id": 4
            }, 
            {
                "translation": "dsadf", 
                "strength": 1, 
                "word": "dvdsf", 
                "word_id": 6
            }
        ]
    }
]

समस्या तब होती है जब मैं url api/users/xxx/words/6 पर जाता हूं यह काम नहीं करता है।

इस यूआरएल के लिए मेरा कोड है

@app.route('/api/users//words/', methods=['GET'])
def get_words(username):
     user = User.objects(username=username)
     l_user = user.to_json()
     decoded = json.loads(l_user)
     return Response(json.dumps(decoded[0]["words"][word_id-1], sort_keys=False, indent=4),
                mimetype='application/json')

अगर मैं बीच में कुछ शब्द हटा देता हूं तो यह काम नहीं करता है।

0
हाँ, यह समस्या है। मैं word_id को समान रखना चाहता हूं। तो जब मैं word_id 4 के साथ शब्द को हटाना चाहता हूं, तो मैं दूसरों के word_id रखना चाहता हूं क्योंकि शब्द क्लाइंट (बैकबोन संग्रह) के साथ सिंक्रनाइज़ होते हैं। तो जब मैं उदाहरण के लिए यूआरएल एपीआई/शब्दों/xxx/शब्द/6 के साथ शब्द को मिटाना चाहता हूं, जो पहले से ही क्लाइंट में है, तो यह काम नहीं करेगा क्योंकि यह डेटाबेस में अलग होगा। आपके समाधान के साथ यदि मेरे पास 100 शब्द थे और मैं word_id 50 के साथ शब्द को हटाना चाहता हूं, तो मुझे 50 शब्दों को फिर से लिखना होगा, और फिर मुझे अपने नए शब्द क्लाइंट को दोबारा भेजना होगा और क्लाइंट पर फिर से मॉडल ल
जोड़ा लेखक SamuelMatis, स्रोत
क्या word_id अभी भी 6 नहीं है? आपको मूल्य में प्राप्त करना होगा या सूची में सख्त क्रम बनाए रखना होगा ... मुझे नहीं लगता कि आप दोनों को मिश्रण कर सकते हैं ...
जोड़ा लेखक Asya Kamsky, स्रोत

1 उत्तर

मिलान करने वाले आइटम को आईडी द्वारा फ़िल्टर करना या मौजूदा नहीं होने पर 404 लौटने का बेहतर तरीका होगा उदाहरण:

@app.route('/api/users//words/', methods=['GET'])
def get_words(username):
     user = User.objects(username=username)
     word = [word for word user.words if word.word_id == word_id]
     if not word:
        return abort(404)
     return Response(word[0].to_json(sort_keys=False, indent=4),
                     mimetype='application/json')
0
जोड़ा