Помощь с модельными отношениями Django - PullRequest
0 голосов
/ 17 апреля 2011
    class Pinyin(models.Model):
    pinyinWord = models.CharField(max_length=200)
    englishWord = models.CharField(max_length=1000)
    englishPhrase = models.TextField()
    pinyinPhrase = models.TextField()
    def __unicode__(self):
        return u"%s | %s" % (self.pinyinWord, self.englishWord)

class Learned(models.Model):
    def __unicode__(self):
        return u"%s | %s | %s | %s" % (self.pinyinWord, self.user, self.date, self.learned) 
    pinyinWord = models.ForeignKey(Pinyin)
    user = models.ForeignKey(User)
    date = models.DateField()
    learned = models.BooleanField()

Я новичок в django и программировании в этом отношении и хочу добавить значение из модели пиньинь в модель обучения, но только если оно еще не было добавлено в обучение для этого конкретного пользователя, но не могу понять, как именно сделай это.

Например, я хочу получить значение из Pinyin, и если Pinyin.id и User.id еще не в Learned, то добавьте слово в модель Learned с идентификатором пользователя, текущей датой и learn, установленными в False / 0.

Ответы [ 2 ]

1 голос
/ 17 апреля 2011

Вы можете использовать мета-опцию модели unique_together:

class Learned(models.Model):
    pinyinWord = models.ForeignKey(Pinyin)
    user = models.ForeignKey(User)
    date = models.DateField()
    learned = models.BooleanField()
    class Meta:
        unique_together = ('user', 'pinyinWord')
0 голосов
/ 17 апреля 2011

Надеюсь, это то, что вы ищете:

uid = User.objects.get(username='Greg').id
pinyin = Pinyin.objects.get(pinyinWord='kuai')

learned, created = Learned.objects.get_or_create(pinyinWord=pinyin.pinyinWord, 
                                                                 user__id=uid)
if created:   # newly INSERTed Learned  instance
     learned.date = datetime.date.today()
     learned.learned = False
     learned.save()

Метод Model.objects.get_or_create сначала пытается Model.objects.get с предоставленными аргументами. Если это не удастся, объект будет создан и созданный будет Истинным, в противном случае созданный будет Ложным.

Поскольку это точный поиск (например, не pinyinWord__contain) для обоих полей, он завершится ошибкой, когда не будет обнаруженного экземпляра, удовлетворяющего обоим полям. Тогда это будет создано.

После этого вы можете установить дату и т. Д. И сохранить экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...