Модель Django с 2 внешними ключами от той же таблицы

Ваш игрок начинает с направления в touchesBegan и останавливает его на touchesEnded. Проблема в том, что вы не обрабатываете изменения направления на touchesMoves.

Давайте создадим глобальную переменную, которая сообщит нам, если мы изменили направление.

var previous_direction : Int = -1 // idle state

В функции касаний добавьте поведение previous_direction.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in (touches as! Set<UITouch>) {

        // we start with previous_direction being the start direction

        if upRect.contains(location) {
            previous_direction = 0  // up
        } else if rightRect.contains(location) {
            previous_direction = 1  // right
        } else if downRect.contains(location) {
            previous_direction = 2  // down
        } else if leftRect.contains(location) {
            previous_direction = 3  // left
        }
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in (touches as! Set<UITouch>) {

        // we create a current_direction also
        var current_direction : Int = -1

        // get current_direction 
        if upRect.contains(location) {
            current_direction = 0 // up
        } else if rightRect.contains(location) {
            current_direction = 1 // right
        } else if downRect.contains(location) {
            current_direction = 2 // down
        } else if leftRect.contains(location) {
            current_direction = 0 // left
        }

        // now we compare if the current_direction is different from previous_direction
        if current_direction != previous_direction
        {
             player.removeAllActions()

             // attribute new direction
             if current_direction == 0 {
                   playerSprite.walkUpPlayer()
             } else if current_direction == 1 {
                   walkLRPlayer.walkLRPlayer()
             } else if current_direction == 2 {
                   walkLRPlayer.walkDownPlayer()
             } else if current_direction == 3 {
                   walkLRPlayer.walkLRPlayer() } 

             // we prepare previous_direction for the next time he enters this function
             previous_direction = current_direction  
        }
    }
 }

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    // reset previous_direction
    previous_direction = - 1 // idle state
}
43
задан Ron 4 July 2016 в 18:22
поделиться

4 ответа

Я еще не сделал этого, но я использовал inspectdb для генерации models.py файла от существующего DB, который делает точно, что - это - то, что inspectdb отбросил назад, таким образом, он должен работать:

creator = models.ForeignKey(Users, null=True, related_name='creator')
assignee = models.ForeignKey(Users, null=True, related_name='assignee')

Hope, которая работает на Вас - если это не, я собираюсь иметь проблему также.

84
ответ дан Technical Bard 26 November 2019 в 22:43
поделиться

Из сообщения об ошибке это кажется, что Вы пытаетесь поместить два внешних ключа в тот же объект на посреднической таблице, используемой через through аргумент ManyToManyField, документация для который состояния :

при установке посреднической модели Вы явно определяете внешние ключи к моделям, которые вовлечены в отношение ManyToMany. Это явное объявление определяет, как эти две модели связаны.

существует несколько ограничений на промежуточную модель:

  • Ваша промежуточная модель должна содержать один - и только один - внешний ключ к целевой модели (это было бы Человеком в нашем примере). Если у Вас будет больше чем один внешний ключ, то ошибка проверки будет повышена.
  • Ваша промежуточная модель должна содержать один - и только один - внешний ключ к исходной модели (это было бы Группой в нашем примере). Если у Вас будет больше чем один внешний ключ, то ошибка проверки будет повышена.
7
ответ дан Jonny Buchanan 26 November 2019 в 22:43
поделиться

Я думаю, что Вы ищете, related_name свойство на ForeignKeyFields. Это позволит Вам ссылаться на ту же таблицу, но давать django специальные названия отношений.

[еще 117] Информация:

8
ответ дан Munim Munna 26 November 2019 в 22:43
поделиться

То, что два столбца являются частью одной таблицы, подразумевает, что эти два поля связаны, для этого для ссылки на них индивидуально не идеально. ForeignKey Вашей модели должен быть первичным ключом таблицы, на которую Вы ссылаетесь:

event = models.ForeignKey('event')

Вы тогда сослались бы на столбцы как таковые:

foo.event.actor
foo.event.receiver

, При необходимости Вы могли бы также изменить путь Ваш класс/ссылки на модель внешние атрибуты со свойствами. В Вашем классе Вы сделали бы следующее:

@property
def actor(self):
  return self.event.actor
@property
def receiver(self):
  return self.event.receiver

Это позволило бы Вам тогда называть foo.actor и foo.receiver, но я верю дольше, foo.event.actor был бы большим количеством pythonic

0
ответ дан awithrow 26 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: